猴dai王也有悲伤时
人生若只如初见 何事秋风悲画扇

网上关于Linq的知识点一抓一大把,本人就讲最关键的注意点标记下来,想要更详细的理解Linq可以参考以下几篇好文章

1.本地数据源用 IEnumerable<T>   (对应参数是Func<>  是直接编译成IL代码,个人理解为立即运行)                        远程数据源用IQueryable<T>   (对应参数是 Expression<>只是存储了一个表达式树,在最终一起处理)

2.在使用IEnumerable<T>和IQueryable<T>的时候还需要注意,IEnumerable<T>查询的逻辑可言直接用我们自定义的方法,而IQueryable<T>则不能使用自定义的方法,它必须先生成表达式树,查询由LINQ to SQL引擎处理。在使用IQueryable<T>查询的时候,若果使用自定义方法,则会抛出异常。

复制代码
            DataContext ctx = new DataContext("server=192.168.0.102;database=Temp;uid=sa;pwd=sa123");
            Table<Person> persons = ctx.GetTable<Person>();
            var temp1 = from p in persons where OlderThan20(p.Age) select p;
            foreach (var item in temp1)
            {
                Console.WriteLine(string.Format("Name:{0}\tAge:{1}", item.Name, item.Age));
            }
复制代码

抛出异常NotSupportedException:方法“Boolean OlderThan20(Int32)”不支持转换为SQL。

但是,如果我们将查询转换成一个IEnumerable<T>查询,这种模式是支持的:

            List<int> list = new List<int>() { 17, 18, 19, 20, 21, 22, };
            var temp2 = from c in list where OlderTan20(c) select c;

3.Linq 有 立即执行和延迟执行 两种执行方式。所以一旦数据异常,一定要考虑是否数据源在采用Linq进行操作之后,在对数据正式执行之前又对数据源进行了改动,避免这种情况可以采用立即执行的方式,将操作的数据立即保留到一个集合中,避免延迟查询的影响

 

http://www.cnblogs.com/yinrq/p/5486103.html  (IL代码介绍)

https://www.cnblogs.com/liqingwen/p/5832322.html#link0

https://www.cnblogs.com/zgqys1980/p/4047315.html  (IEnumerable<T>和IQueryable<T>的区别)

https://blog.csdn.net/houwc/article/details/52399124

http://www.cnblogs.com/liqingwen/p/5801249.html

 

posted on 2018-12-26 13:49  猴dai王也有悲伤时  阅读(182)  评论(0)    收藏  举报