设为首页 加入收藏

TOP

【C#夯实】我与接口二三事:IEnumerable、IQueryable 与 LINQ(四)
2019-09-17 18:23:52 】 浏览:75
Tags:夯实 我与 接口 二三 IEnumerable IQueryable LINQ
m c in q

                                      orderby c.Name

                                      select c;

 

使用IQueryable<T>所内置的LINQ to SQL机制。

(LINQ to SQL程序库会把相关的查询操作合起来执行,仅向数据库发出一次调用,即where和orderby都是在同一次SQL查询中完成。)

            var q = (from c in dbContext.Customers

                        where c.City == "London"

                        select c).AsEnumerable();

            var finalAnswer = from c in q

                                      orderby c.Name

                                      select c;

 

把数据库对象强制转换成IEnumerable形式的序列,并把排序等工作放在本地完成。

(即会把where字句后得到的结果转换成IEnumerable<T>的序列,再采用LINQ to Objects机制完成后续,排序是通过委托在本地执行。)

  注意:

  两种不同的数据处理方式,依循着两套完全不同的流程。无论是用lambda表达式来撰写查询逻辑还是以函数参数的形式来表示这些逻辑,针对IEnumerable<T>所设计的那些扩展方法都将其视为委托。反之,针对IQueryable<T>的那些扩展方法用的则是表达式树。【表达式树 可以把各种逻辑合并起来成一条SQL语句。】

 

public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
public static IQueryable<TSource> Where<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate)

 

  如果使用IEnumerable<T>,则必须在本地进行。系统把lambda表达式编译到方法里,在本地计算机上运行,这意味着无论有待处理的数据在不在本地,都必须先获取过来才行。

  同时,用来支持IQueryable的那些Provider未必能够完全解析每一种查询,通常这些Provider只能解读几种固定的(.NET Framework已经实现)的运算符(方法),如果要在查询操作里面调用除此之外的其它方法,那可能就得把序列当成IEnumerable来查询。

 

吐槽    :emmmmmm,,,本来是想写我与接口二三事,结果竟然如此跑偏,太多细节能扣啦,知识点冥冥间也有关联,慢慢捋吧~

立Flag:本月开启机器学习,今年要把C#基础篇搞定。

 

注释:

[1] 自《深入理解C#》(第3版)Jon Skeet 著  姚琪琳 译

[2] 自《Effective C#》(第3版) 比尔·瓦格纳 著

 

首页 上一页 1 2 3 4 下一页 尾页 4/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇ASP.NET+d3.js实现Sqlserver数据.. 下一篇新增筛选方案

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目