这篇文章将为大家详细讲解有关linq怎么实现组合,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
之前被误导,说是linq怎么实现组合捏?因为linq是预编译滴,没有办法想拼一个sql字符串出来,让我纠结很久,但是,我觉得微软的人应该比较厉害,所以我本着“有困难要上,没有困难制造困难也要上”的原则,在还没有熟悉LINQ TO ADO.NET的情况下,我觉得决定在最近的我自己独立完成小项目里使用ASP.NET MVC + ADO.NET EF。一般的信息系统都有一个组合查询的功能,我很快用jquery做了这样一个功能。
这个表单将组合条件提交后台,我先将它封装成条件对象的数组:
publicclassCondition
{
///<summary>
///字段
///</summary>
publicstringField{get;set;}
///<summary>
///表达式
///</summary>
publicstringOperator{get;set;}
///<summary>
///值
///</summary>
publicstringValue{get;set;}
///<summary>
///关系
///</summary>
publicstringRelation{get;set;}
///<summary>
///
///</summary>
///<paramnameparamname="fileds"></param>
///<paramnameparamname="operators"></param>
///<paramnameparamname="values"></param>
///<paramnameparamname="relations"></param>
///<returns></returns>
publicstaticCondition[]BuildConditions(string[]fileds,
string[]operators,string[]values,string[]relations)
{
if(fileds==null||operators==null||values==null||relations==null)
{
returnnull;
}
Condition[]conditions=newCondition[fileds.Length];
try
{
for(inti=0;i<conditions.Length;i++)
{
conditions[i]=newCondition()
{
Field=fileds[i],
Operator=operators[i],
Value=values[i],
Relation=relations[i]
};
}
}
catch
{
returnnull;
}
returnconditions;
}
}
实际上,编译器是把Linq表达式编译成expression tree的形式,我只需要将条件对象数组转换为expression tree就可以了。
我先将一个条件转化为一个简单的expression。
privatestaticExpressionConditonToExpression(Conditioncondition,Expressionparameter) { Expressionexpr=null; Typetype=typeof(EDM_Resource); PropertyInfopi=type.GetProperty(condition.Field); ExpressionExpressionleft=Expression.Property(parameter,pi); objectvalue=Convert.ChangeType(condition.Value,pi.PropertyType); ExpressionExpressionright=Expression.Constant(value); switch(condition.Operator) { case"=": expr=Expression.Equal(left,right); break; case"<": expr=Expression.LessThan(left,right); break; case"<=": expr=Expression.LessThanOrEqual(left,right); break; case">": expr=Expression.GreaterThan(left,right); break; case">=": expr=Expression.GreaterThanOrEqual(left,right); break; } returnexpr; }
然后组合,变成一个Linq表达式,追加到where上。
publicIList<EDM_Resource>FindByGroup(EDM_ResGroupresGroup,
Condition[]conditions,intfirst,intlimit,outintcount)
{
using(ShengjingEDM2Entitiescontext=newShengjingEDM2Entities())
{
IQueryable<EDM_Resource>result=DoFindByGroup(resGroup,context);
ParameterExpressionparameter=Expression.Parameter(typeof(EDM_Resource),"r");
Expressionbody=null;
if(conditions!=null&&conditions.Length>0)
{
body=ConditonToExpression(conditions[0],parameter);
for(inti=1;i<conditions.Length;i++)
{
Expressionright=ConditonToExpression(conditions[i],parameter);
body=conditions[i-1].Relation.ToUpper().Equals("AND")?
Expression.And(body,right):
Expression.Or(body,right);
}
}
if(body!=null)
{
Expression<Func<EDM_Resource,bool>>expr=Expression.
Lambda<Func<EDM_Resource,bool>>(body,parameter);
resultresult=result.Where<EDM_Resource>(expr);
}
resultresult=result.OrderByDescending<EDM_Resource,int>(r=>r.ResourceID);
count=result.Count<EDM_Resource>();
returnresult
.Skip<EDM_Resource>(first)
.Take<EDM_Resource>(limit)
.ToList<EDM_Resource>();
}
}
关于“linq怎么实现组合”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。