2015-05-26 56 views
3

我的項目目前使用的爲我在用什麼? (LINQ/SQL)

var le = domainModel.EntityDataContext.Table_name_here.Query() 
        .WithFullReadCheck(domainModel.Security) 
        .Where(x => x.Metadata.AdvisorID == advisorId).FirstOrDefault(); 

據說上面的代碼是LINQ,是不知道有關LINQ我決定去學!「LINQ」下面的語法。然而,在https://msdn.microsoft.com/en-us/library/gg509017.aspx,事情是非常不同的。

我的代碼中使用了什麼?它是linq的一個版本嗎?還有別的嗎?

+4

我以爲兩者都是LINQ,一個是另一個的語法糖。 (你鏈接的那個,沒有雙關語意思,是語法糖,產生類似於你在這裏發佈的東西) – Borgleader

+0

實際上,鑑於「LINQ」已經成爲C#世界中的一個流行詞(有時,每次使用的擴展方法被稱爲「LINQ」),我認爲這是一個很好的問題。 –

+0

@Borgleader我沒有得到意想不到的雙關語。編輯:哦,哇,我很慢。 – SimpleVar

回答

5

你正在使用的是LINQ。有2個不同的符號,你可以使用書寫LINQ - lambda語法查詢語法

這裏的區別是解釋道:LINQ: Dot Notation vs Query Expression

有這個MSDN上這裏的更多信息:https://msdn.microsoft.com/en-us/library/bb308959.aspx

MSDN文章開始用類似SQL的語法(「查詢語法」)解釋LINQ,然後繼續解釋Lambda表達式和表達式樹(「lamba語法」)。

+2

這個答案對於權威性的(閱讀:由微軟公司發佈的)源代碼會更好,它明確聲明「LINQ」不是SQL類語法(或者至少是使用lambda語法的Microsoft產生的LINQ示例)。 –

+1

謝謝 - 更新以引用MSDN文章,其中顯示了這兩種變體的使用。 –

1

這是查詢的擴展方法語法。 .Query().WithFullReadCheck()不太常見,但其餘.Where.FirstOrDefault是很常見的查詢擴展。 LINQ是一種特殊的語法,用於表達與鏈接查詢擴展方法可以完成的相同的事情。在幕後,他們是相同的。

參見這個問題這使兩者LINQ和延伸方法的語法的一個例子,具有它們之間的差異的良好的討論:Extension methods syntax vs query syntax

1

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,只是在該方法被調用的瞬間執行操作。

1

Linq(語言集成查詢)是用來查詢數據的語言。你不在乎它們來自哪裏,這就是使用它的關鍵。您可以使用相同的代碼來查詢數組,集合,數據庫,xml文件,目錄,無論什麼... Linq在後臺翻譯您的代碼,所以如果您使用它來從數據庫獲取數據,它會生成SQL被髮送到數據庫。

有兩種語法形式:

1)lambda語法
2)可鏈接的方法

不要緊,你選擇哪一個,只是儘量與它一貫使用什麼讓你更舒適/更有意義的情況。