這是根據是否有一些匹配的ID來返回布爾值。IQueryable.Where()實際發生了什麼?
from t in getAll
select new Result
{
...
bool DetailsAvailable =
(db.SaveTrackings.Where(s => s.BundleID == t.bundleID
&& s.UserID == t.userID)
.Count() > 0) ? true : false;
}
這就是我想明白了:.Where()
將返回所有匹配的ID的條目,然後.Count()
只是看到究竟有多少。我只是覺得我有一半明白我們需要s
。
我知道從這段代碼中可以期待什麼,因爲它已經被使用了,我只是不明白它是如何工作的,MSDN中的一些文檔使用了一些令我困惑的術語。
所有lambda表達式使用拉姆達 運算符=>,它讀作 「去 於」。 lambda 運算符的左側指定輸入 參數(如果有的話),並且右側 包含表達式或語句 塊。 lambda表達式x => x * x被讀取爲「x轉到x次x」。
所以怎麼了,我想明白了什麼我的代碼意味着在此基礎上,.Where(s
「變爲」 s.BundleID == t.BundleID
...),所以這裏發生了什麼? 「去」是什麼意思?是否將s
中的每個ID與t
中的每個ID進行比較?我怎麼理解爲什麼它被稱爲「去」和究竟發生了什麼?
然後它變得更加撲朔迷離......
=>運算符具有相同的優先級 如賦值(=),是 右結合。
Lambdas用於基於方法的LINQ 查詢作爲標準查詢的參數 運算符方法(如Where)。
當您使用基於方法的語法來調用 Where方法在 枚舉類(如你在LINQ做 對象和LINQ to XML)的參數 是委託類型System.Func。拉姆達表達式是創建 委託的最方便的方式。
什麼是代表類型System.Func<T, TResult>
以及它是如何使用此「去」運算符創建的?
我不能只是使用代碼,因爲我知道它的工作,我需要了解如何/爲什麼。
如果您真的只需要一個true或false,那麼使用Any函數而不是where + count可能更有效?一旦一個項目爲真,db.SaveTrackings.Any(相同的謂詞)將立即返回true。 – 2010-08-18 16:03:08
@John謝謝,如果我只能理解這個整個委託/ lambda事件發生了什麼,試圖讓我的頭在 – BigOmega 2010-08-18 18:01:44
位,它會花一點時間,然後它只會「點擊」。最簡單的方法就是將它們視爲沒有名字的迷你函數。語法可能會有點奇怪,特別是沒有參數...()=> {等等等等等等等等等等等等。 WTH是那樣的!:D – 2010-08-19 15:54:36