这篇文章将为大家详细讲解有关linq怎么实现组合,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
创新互联主营鹤峰网站建设的网络公司,主营网站建设方案,重庆APP软件开发,鹤峰h5成都小程序开发搭建,鹤峰网站营销推广欢迎鹤峰等地区企业咨询
之前被误导,说是linq怎么实现组合捏?因为linq是预编译滴,没有办法想拼一个sql字符串出来,让我纠结很久,但是,我觉得微软的人应该比较厉害,所以我本着“有困难要上,没有困难制造困难也要上”的原则,在还没有熟悉LINQ TO ADO.NET的情况下,我觉得决定在最近的我自己独立完成小项目里使用ASP.NET MVC + ADO.NET EF。一般的信息系统都有一个组合查询的功能,我很快用jquery做了这样一个功能。
这个表单将组合条件提交后台,我先将它封装成条件对象的数组:
publicclassCondition
{
///
///字段
///
publicstringField{get;set;}
///
///表达式
///
publicstringOperator{get;set;}
///
///值
///
publicstringValue{get;set;}
///
///关系
///
publicstringRelation{get;set;}
///
///
///
///<paramnameparamname="fileds">
///<paramnameparamname="operators">
///<paramnameparamname="values">
///<paramnameparamname="relations">
///
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
;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
FindByGroup(EDM_ResGroupresGroup,
Condition[]conditions,intfirst,intlimit,outintcount){
using(ShengjingEDM2Entitiescontext=newShengjingEDM2Entities())
{
IQueryable
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
;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
,bool>>expr=Expression.
Lambda,bool>>(body,parameter); resultresult=result.Where
(expr); }
resultresult=result.OrderByDescending
,int>(r=>r.ResourceID); count=result.Count
(); returnresult
.Skip
(first) .Take
(limit) .ToList
(); }
}
关于“linq怎么实现组合”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。