[英]Conventions for joins in Entity Framework 6.1.0 Code First
我相信我的問題很簡單(不確定答案是否也是如此):
有誰知道如何強迫實體框架使用“ INNER JOIN”作為默認約定,而不是“ LEFT OUTER JOIN”?
如果要顯式強制執行內部聯接或外部聯接,則始終可以分別分別使用Join
或GroupJoin
方法。 (或綜合等效項join
並join ... into
)。
但是,通常來說,在LINQ語句中,應該避免使用顯式的join語句。 請改用導航屬性 。 導航屬性是已在實體之間定義的關聯 。 通過導航屬性查詢就是通過聯接查詢而無需手工編碼。 但是這些連接何時會成為內部的或外部的?
采取以下三個簡單的類:
class Product
{
public int Id { get; set; }
public string Name { get; set; }
public int CategoryId { get; set; }
public Category Category { get; set; }
public int? PhotoId { get; set; }
public Photo Photo { get; set; }
}
class Category
{
public int Id { get; set; }
public string Name { get; set; }
public ICollection<Product> Products { get; set; }
}
class Photo
{
public int Id { get; set; }
public byte[] Image { get; set; }
}
如果我們查詢產品,包括其類別和照片,將會怎樣?
context.Products.Include(p => p.Category).Include(p => p.Photo)
實體框架通過查看關聯的基數來確定它是可以生成首選的內部聯接,還是生成外部聯接:
因此,在這種情況下,它將在Product
和Category
之間生成一個內部聯接,在Product
和Photo
之間生成一個外部Photo
。
我認為這是一個明智的選擇。 如果在結果集中包含照片會突然減少獲取的項目數,那將是意外的行為。
同樣適用於其他查詢形狀,例如
context.Products.Select(p => new { p.Name, Cat = p.Category.Name })
這將生成一個內部聯接。
context.Products.Select(p => new { p.Name, Cat = p.Photo.Image })
這將生成一個外部聯接。
如果在后一個示例中,您僅查詢Photo != null
產品,EF不夠聰明(還算?)以至於它無法生成內部Photo != null
。 在這種情況下,您可能想編寫一個顯式的LINQ連接。
因此,對導航屬性的關注使您的注意力從...
如何強制實體框架使用“ INNER JOIN”
...更多與業務邏輯相關的決定,無論是關聯是必需的還是可選的。
默認情況下, join
子句會產生Inner join
。
from x in table1
join y in table2 on x.id equals y.id
要使其充當外部聯接,您可以使用DefaultIfEmpty
方法,如下所示:
from x in table1
join y in table2 on x.id equals y.id into jointable
from z in jointable.DefaultIfEmpty()
如果將正在執行的查詢添加到您的問題中,我們可以弄清楚為什么會生成“ Left Outer Join
。
這是解釋問題的好資源: http : //msdn.microsoft.com/zh-cn/library/bb311040.aspx
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.