英文原文是Matt Warren 发表在MSDN Blogs的系列文章之一,英文渣渣,翻译不供参考 ,请直接看原文 。
你又以为这个系列已经完成,所以我已经转移到其他阵地上去了吗?因为Select操作工作得非常好,所以你以为前面所讲的就是你构建自己的IQueryable
提供程序所需要了解的所有内容了吗?哈!还有很多需要学习的呢,而且,Select操作还是有些漏洞。
Finishing Select有漏洞?怎么可能?我把你当成从来不会出错的微软大神,但是你却说你给我的是劣质的代码?我把已经把代码复制粘贴到产品里,老板已经说了下周一就启动!你怎么能这么做?(喘气)
放心啦,不是什么严重的漏洞,只是一点小小的缺陷而已。
回想一下,在上篇文章中,我建了四种表达式节点,Table,Column,Select和Projection,它们工作十分良好,不是吗?有漏洞的地方是我没有考虑到所有可以写查询表达式的地方。我考虑到的只是最明显的Projection节点出现在查询表达式树顶的情况。毕竟,因为我只支持Select
和Where
,所以最后一个操作必定是这两者之一。我的代码就是这样假设的。
这不是问题所在。
问题是Projection节点也有可能出现在选择器表达式里面,例如,看下面的查询。
1 2 3 4 5 6 7 var query = from c in db.Customers select new { Name = c.ContactName, Orders = from o in db.Orders where o.CustomerID == c.CustomerID select o };