簡體   English   中英

Entity Framework 6.1.0 Code First中的連接約定

[英]Conventions for joins in Entity Framework 6.1.0 Code First

我相信我的問題很簡單(不確定答案是否也是如此):

有誰知道如何強迫實體框架使用“ INNER JOIN”作為默認約定,而不是“ LEFT OUTER JOIN”?

如果要顯式強制執行內部聯接或外部聯接,則始終可以分別分別使用JoinGroupJoin方法。 (或綜合等效項joinjoin ... 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)

實體框架通過查看關聯的基數來確定它是可以生成首選的內部聯接,還是生成外部聯接:

  • 所需的關聯會生成一個內部聯接。
  • 可選的關聯會生成外部聯接。

因此,在這種情況下,它將在ProductCategory之間生成一個內部聯接,在ProductPhoto之間生成一個外部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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM