Dynamic Linq Query 简单API

Dynamic Linq Query  是Sott(一个.Net Platform的专家)针对于Linq自己写的扩展库,方便 以字符串拼接的方式使用Linq查询 。网上中文的Dynamic Linq Query API资料很少,而且Sott的博客给出的Sample也非常简单。最近通过查询各种英文资料,以及对于StackOverflow上相关问题的整理,简单的总结了一下API.注意这个Library是对于IQueryable接口的扩展,而对于List<Member> _list来讲,使用Linq语句最初获取的是IEnumbale接口类型,所以要 在最开始的时候进行AsQueryable转换 。以前ADO.NET的时候,通过前台传过来的参数值,拼接SQL字符串语句,然后执行。现在也可以通过字符串拼接Linq语句然后执行。

[csharp]  view plain  copy
  1. public class Address  
  2.    {  
  3.        public int Id { getset; }  
  4.        public string Street { getset; }  
  5.        public string Door { getset; }  
  6.    }  
  7.   
  8.    public class Member  
  9.    {  
  10.        public int Id { getset; }  
  11.        public string Name { getset; }  
  12.        public string Level { getset; }  
  13.        public Address MyAddress { getset; }  
  14.    }  
  15.   
  16.    public class DynamicLinqQueryTest  
  17.    {  
  18.        public List<Member> _list = new List<Member>();  
  19.   
  20.        public void Initilize()  
  21.        {  
  22.            for (int i = 0; i < 20; i++ )  
  23.            {  
  24.                Member member = new Member();  
  25.                member.Id = i + 1;  
  26.                member.Name = "Member" + (i + 1);  
  27.                member.MyAddress = new Address()   
  28.                {  
  29.                    Id = i + 1,  
  30.                    Street = "Street" + (i + 1),  
  31.                    Door = "Door" + (i + 1)  
  32.                };  
  33.                member.Level = "Level" + (i + 1);  
  34.            }  
  35.        }  
  36.   
  37.        public void Test()  
  38.        {  
  39.            Initilize();  
  40.            var members = (from m in _list select m).AsQueryable<Member>().Take<Member>(5).Where("d=@0 and Level=@1", 2, "Level2").  
  41.                Where("Name.Contains(@0)""6").OrderBy("MyAddress.Street, Level desc").Select("new(Id as MyId, Level)");  
  42.            foreach (dynamic member in members)  
  43.            {  
  44.                int Id = member.Id;  
  45.                string name = member.Name;  
  46.                Console.WriteLine(name + Id);  
  47.            }  
  48.        }  
  49.    }  

方法分析:

OrderBy(string parm) 这个方法是用来排序的,其参数为Member的某一个字段,或者多个字段,并且可以传入排序方式
OrderBy("Level")
OrderBy("Level desc, Name")
OrderBy("MyAddress.Street, Level desc")

Where(string parm, parmas[] values) 方法是用来根据指定条件进行筛选的,包括SQL中的like语句,这里用Contain关键字
where("Id=@0 and Level=@1", 2, "Level2")
Where("Name.Contains(@0)", "6")

Select("")方法是用来指定要返回的字段,并且可以为字段指定别名。如果在整个Linq语句中不使用此方法,则默认返回所有字段
Select("new(Id as MyId, Level)")

当需要分页的时候,我没有找到相应的扩展方法,但是我发现,可以使用IQueryable自带的方法Take(int count)

另外要注意的是,返回的集合中的单个元素都是动态类型,需要使用dynamic关键字来进行遍历,不能使用var关键字。这涉及到关于编译期间是否进行类型检查的问题

PS: Dynamic Linq Query的使用方法跟一般扩展方法一样,在项目中建一个static的类,然后把源代码拷贝进去就行使用了。源代码可以在Scott的博客中去下载Sample Project

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值