2010-08-08 41 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