千家信息网

linq怎么实现组合

发表于:2024-09-22 作者:千家信息网编辑
千家信息网最后更新 2024年09月22日,这篇文章将为大家详细讲解有关linq怎么实现组合,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。之前被误导,说是linq怎么实现组合捏?因为linq是预编译滴,没有办
千家信息网最后更新 2024年09月22日linq怎么实现组合

这篇文章将为大家详细讲解有关linq怎么实现组合,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

之前被误导,说是linq怎么实现组合捏?因为linq是预编译滴,没有办法想拼一个sql字符串出来,让我纠结很久,但是,我觉得微软的人应该比较厉害,所以我本着"有困难要上,没有困难制造困难也要上"的原则,在还没有熟悉LINQ TO ADO.NET的情况下,我觉得决定在最近的我自己独立完成小项目里使用ASP.NET MVC + ADO.NET EF。一般的信息系统都有一个组合查询的功能,我很快用jquery做了这样一个功能。

这个表单将组合条件提交后台,我先将它封装成条件对象的数组:

  1. publicclassCondition

  2. {

  3. ///<summary>

  4. ///字段

  5. ///summary>

  6. publicstringField{get;set;}

  7. ///<summary>

  8. ///表达式

  9. ///summary>

  10. publicstringOperator{get;set;}

  11. ///<summary>

  12. ///值

  13. ///summary>

  14. publicstringValue{get;set;}

  15. ///<summary>

  16. ///关系

  17. ///summary>

  18. publicstringRelation{get;set;}

  19. ///<summary>

  20. ///

  21. ///summary>

  22. ///<paramnameparamname="fileds">param>

  23. ///<paramnameparamname="operators">param>

  24. ///<paramnameparamname="values">param>

  25. ///<paramnameparamname="relations">param>

  26. ///<returns>returns>

  27. publicstaticCondition[]BuildConditions(string[]fileds,
    string[]operators,string[]values,string[]relations)

  28. {

  29. if(fileds==null||operators==null||values==null||relations==null)

  30. {

  31. returnnull;

  32. }

  33. Condition[]conditions=newCondition[fileds.Length];

  34. try

  35. {

  36. for(inti=0;i<conditions.Length;i++)

  37. {

  38. conditions[i]=newCondition()

  39. {

  40. Field=fileds[i],

  41. Operator=operators[i],

  42. Value=values[i],

  43. Relation=relations[i]

  44. };

  45. }

  46. }

  47. catch

  48. {

  49. returnnull;

  50. }

  51. returnconditions;

  52. }

  53. }

实际上,编译器是把Linq表达式编译成expression tree的形式,我只需要将条件对象数组转换为expression tree就可以了。

我先将一个条件转化为一个简单的expression。

privatestaticExpressionConditonTo_Expression(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上。

  1. publicIList<EDM_Resource>FindByGroup(EDM_ResGroupresGroup,
    Condition[]conditions,intfirst,intlimit,outintcount)

  2. {

  3. using(ShengjingEDM2Entitiescontext=newShengjingEDM2Entities())

  4. {

  5. IQueryable<EDM_Resource>result=DoFindByGroup(resGroup,context);

  6. ParameterExpressionparameter=Expression.Parameter(typeof(EDM_Resource),"r");

  7. Expressionbody=null;

  8. if(conditions!=null&&conditions.Length>0)

  9. {

  10. body=ConditonToExpression(conditions[0],parameter);

  11. for(inti=1;i<conditions.Length;i++)

  12. {

  13. Expressionright=ConditonToExpression(conditions[i],parameter);

  14. body=conditions[i-1].Relation.ToUpper().Equals("AND")?

  15. Expression.And(body,right):

  16. Expression.Or(body,right);

  17. }

  18. }

  19. if(body!=null)

  20. {

  21. Expression<Func<EDM_Resource,bool>>expr=Expression.
    Lambda<Func<EDM_Resource,bool>>(body,parameter);

  22. resultresult=result.Where<EDM_Resource>(expr);

  23. }

  24. resultresult=result.OrderByDescending<EDM_Resource,int>(r=>r.ResourceID);

  25. count=result.Count<EDM_Resource>();

  26. returnresult

  27. .Skip<EDM_Resource>(first)

  28. .Take<EDM_Resource>(limit)

  29. .ToList<EDM_Resource>();

  30. }

  31. }

关于"linq怎么实现组合"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

0