2012-02-21 29 views
2

我已經看到多個條款在LINQ查詢現在幾十倍的意思,但還沒有想出如何對應於TSQL語句。什麼是多重的,從選擇在LINQ查詢

var r = from p in products 
     from d in departments 
     from c in something 
     select p; 

是什麼呢?

這是否轉換到SQL爲SELECT * FROM products, departments, something

此外,在這種情況下,select應該永遠是一個SelectMany。我怎麼知道當select實際上是SelectMany

+0

「我怎麼知道什麼時候選擇實際上是一個的SelectMany」(這並非因爲它的聲音是咄咄逼人)? – AakashM 2012-02-21 09:18:05

回答

3

這將轉換成代碼概念是這樣的:

var r = products.SelectMany(p => departments, (p, d) = new { p, d }) 
       .SelectMany(z => something, (z, c) => new { z, c }) 
       .Select(zz => zz.z.p); 

基本上每個from後的第一個添加到SelectMany一個額外的電話。事實上,在這種情況下,編譯器會發現,最後from條款後有只是一個select,它將實際上翻譯成這樣:

var r = products.SelectMany(p => departments, (p, d) = new { p, d }) 
       .SelectMany(z => something, (z, c) => z.p); 

...但我傾向於認爲的「邏輯」先形成。

注意,在這種情況下,你還沒有用過from子句中較早的範圍變量,但您可以:

var query = from person in people 
      from friend in person.Friends 
      select person.Name + " is friends with " + friend.Name; 
0

在這種情況下,它沒有任何意義,使用select(這不是語義上正確的,你必須使用SelectMany)

2

如何對應一個TSQL語句?

這取決於你如何使用你的from子句。如果您使用:

var query = from d in context.Departments 
      from e in context.Employees 
      select d; 

您的查詢將爲CROSS JOIN,因爲產品和所用部門之間沒有關係。因此,像:

SELECT d.* FROM Departments AS d 
CROSS JOIN Employees AS e 

很顯然,你應該避免交叉連接。如果改爲使用第二from導航屬性:

var query = from d in context.Departments 
      from e in d.Employees 
      select d; 

您將可使用INNERLEFT JOIN(EF會決定使用基於關係的多重性映射哪一個)。因此,像: - 你爲什麼關心

SELECT d.* FROM Departments AS d 
LEFT OUTER JOIN Employees AS e ON d.Id = e.DepartmentId