最近频繁接触Linq,收获巨大。linq不但可以直接执行sql语句,还能通过动态Linq组合字符串参数得到查询结果,期间还弱弱的使用了下反射机制组合lamdba(拉姆达)表达式进行匿名排序,下面做些小结,方面以后编程随时翻查。
动态Linq的demo可以在该网站找到:http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx,翻到下面找到 Basic Dynamic LINQ C# Sample 下载即可。其实当我下载完该demo,我才发现公司平台也已经封装好类似的动态linq了,名为DynamicQueryable。很好很强大啊,直接用就好了。
在写linq过程中,我喜欢用lamdba表达式,尽量不用from t in db.Table这种写法。在进行对查询结果分组后排序时,一般的linq写法是:
var entity=db.Table.Where(o=>o.field1.Equals(1) && o.field2>8).GroupBy(g=>new {g.field1,g.field2,g.field3,g.field4}).OrderBy(t=>t.Key.field1);
为了能动态传参数到linq查询里,这时动态linq派上用场了,使用了牛人们写好的DynamicLibrary.cs类或DynamicQueryable.cs,引用必要的命名空间,上面的linq语句就可以用字符串作参数传进去了,可改写成:
var entity=db.Table.Where("field1=1 and field2>8").GroupBy("field1,field2,field3,field4").OrderBy("field1");
这样就和常规的SQL语句组合一样使用,相当方面,详细可参考该网址:http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx
若不使用动态linq,利用反射机制组合lamdba表达式,也可以达到效果,以排序的OrderBy为例,传入要排序的列名字符串,得到查询结果,代码如下:
/// <summary>
/// 利用反射机制获取列名
/// </summary>
private object GetPropertyValue(object obj, string property)
{
System.Reflection.PropertyInfo propertyInfo = obj.GetType().GetProperty(property);
return propertyInfo.GetValue(obj, null);
}
string fieldname="SortIndex";
var entity=db.Table.OrderBy(l => GetPropertyValue(l, fieldname); //升序排列
var entity=db.Table.OrderByDescending(l => GetPropertyValue(l, fieldname); //降序排列
轻松实现变量参数结合lamdba表达式,返回linq查询结果,目前仅对OrderBy操作实践成功。另外在网上还找到了一款用于Linq运算和测试的工具:LinqPad,功能丰富,操作简单,可像SQL新建查询那样敲入linq语句,检查linq语法并返回查询结果,该工具的下载地址是:http://www.linqpad.net/。
好了,搞掂收工回家~
11.15更新:可以利用Func委托定义一个lamdba表达式作为参数传进Linq。
Func<Table, object> objPredicate = l => GetPropertyValue(l, array[0].Trim());
var entity=db.Table.OrderBy(objPredicate); //升序排列
var entity=db.Table.OrderByDescending(objPredicate); //降序排列