2010-08-08 45 views
4

我有以下语句中使用时不同的结果:当WHERE子句的LINQ语句中使用的生产外

List<string> tracks = new List<string> { "ABC", "DEF" }; 
var items = (from i in Agenda.AgendaSessions 
    select i).Where(p => p.Tracks.Any(s => tracks.Contains(s.Code))); 

这将返回轨道包含不是ABC DEF所有会话,现在当我重写喜欢的声明如下所示,无论返回所有会话,就好像该子句总是成立,任何人都可以对此有所了解吗?

var items = from i in Agenda.AgendaSessions 
    where i.Tracks.Any(s=> tracks.Contains(s.Code)) 
    select i; 

更新

如果在这里内的其他条款,不影响结果吗?

+1

样品是相同的。除了第一种情况,你创建一个新的枚举器。 “Agenda.AgendaSessions.Where(...)'? – 2010-08-08 09:26:33

+0

我知道他们是等效的,但为什么第二个产生正确的结果呢? – Ayyash 2010-08-08 10:48:19

回答

2

这两个代码片段是等效的,即它们在任何情况下都应该始终产生相同的结果。当然,假定AgendaSessionsTracks.Contains()是我们所期望的;如果他们是财产获得者/方法有好奇的副作用,如修改tracks的内容,则可能发生任何事情。换句话说,不知道代码的其余部分是什么样子,我们无法帮到你,因为这两个代码片段之间没有语义上的区别。

+0

那么我的问题是,声明的结构如何影响结果呢? AgendaSessions及其曲目都是列表,并且它们都在应用程序加载时加载一次,所以一旦它们到达此阶段就不会进行处理,曲目列表就像您看到的那样,不会沿着路径进行处理总之...但无论如何,我会准备一个更简单的测试来确认行为......见解? – Ayyash 2010-08-08 21:02:27

+0

我准备了一个更简单的例子,我想我现在知道什么地方出了问题,我有一个“Where A || B”,并且我继续添加“&& C”而没有放置正确的脚架,这就是为什么第二个语句有完全不同哪里条款...愚蠢的是不是? – Ayyash 2010-08-11 04:11:06