LINQ是「語言集成查詢」。實際上,這對大多數人來說意味着兩件事:
內聯委託由編譯器轉換爲表達式樹而不是匿名方法的方式。這意味着x => x.Metadata.AdvisorID == advisorId
在編譯時沒有被編譯到IL中:而是被編譯成代碼,這些代碼構建了一個等效的Expression
對象,該對象可以傳遞給提供者,例如實體框架或LINQ to SQL,以便生成數據庫查詢。
這意味着大多數人來說,另一部分是所謂的「語法糖」,代表你這有效地調用.Where()
,.OrderBy()
等:
from a in something
where a.Name == "Bob"
select a;
在這兩種情況下,在.NET中Queryable
類提供了構建Expression
對象鏈的擴展方法,例如.Where()
,.OrderBy()
,.Select()
等 - 這些採用IQueryable
(無類型或帶有泛型參數)並返回另一個。他們在表示整個查詢的每個點處輕輕地包裝一個Expression
對象。
含義:
someQueryable.Where(x => x.Id > 3).OrderBy(x => x.Date).Select(x => x.Ref)
返回實現IQueryable
對象持有的Expression
它看起來像:
Select(OrderBy(Where(someQueryable, x => x.Id > 3), x => x.Date), x => x.Ref)
...它是由LINQ提供可讀產生類似:
SELECT Ref FROM someTable WHERE Id > 3 ORDER BY Date
最後,要注意.Where()
,.OrderBy()
和等不限於可查詢/ LINQ的對象。它們也存在於IEnumerable
(和IEnumerable<>
) - 但這不是LINQ,只是在該方法被調用的瞬間執行操作。
我以爲兩者都是LINQ,一個是另一個的語法糖。 (你鏈接的那個,沒有雙關語意思,是語法糖,產生類似於你在這裏發佈的東西) – Borgleader
實際上,鑑於「LINQ」已經成爲C#世界中的一個流行詞(有時,每次使用的擴展方法被稱爲「LINQ」),我認爲這是一個很好的問題。 –
@Borgleader我沒有得到意想不到的雙關語。編輯:哦,哇,我很慢。 – SimpleVar