2014-04-17 65 views
0

我想知道至極一個是性能LINQ邏輯加入VS內連接

//Logical 
var query = from i in db.Item 
      from c in db.Category 
      where i.FK_IdCategory == c.IdCategory 
      Select new{i.name, c.name}; 
//or 

//Join 
var query2 = from i in db.Item 
      join c in db.Category 
      on c.ID equals i.FK_IdCategory 
      Select new{i.name, c.name}; 

回答

0

這兩個查詢的性能實際上取決於您使用的是哪個LINQ提供程序以及哪個RDBMS。假設SQL Server中,首先會生成以下查詢:

select i.name, c.name 
from Item i, Category c 
where i.FK_idCategory = c.IdCategory 

而第二會產生:

select i.name, c.name 
from Item i 
inner join Category c 
    on i.FK_idCategory = c.IdCategory 

在解釋這恰好運行在SQL Server中的相同:Explicit vs implicit SQL joins

0

這取決於你使用的ORM,以及如何聰明它在優化你的查詢您的後端更好。 實體框架可以生成一些非常糟糕的SQL,如果你不完美的做你的linq,所以我會假設query2更好。

您肯定知道的唯一方法是檢查兩個查詢生成的SQL。 目測它,它看起來像query1會導致這兩個表被完全拉動,然後在您的應用程序中相互過濾,而查詢2肯定會在查詢中生成一個INNER JOIN,這將讓SQL Server執行它確定最佳的邏輯。

是否FK_IdCategory字段是該表上實際外鍵索引的成員?如果不是這樣,那麼這樣做(並且將名稱列作爲索引中的包含列)並且您的查詢將具有非常高的性能。

0

使用linq2Sql或EntityFramework,你可能會這樣做:

var query = from i in db.Item 
      select new {i.name, i.Category.Name} 

這將生成適當的SQL內部聯接。

我的確假定Item和Category之間有一個外鍵關係。