簡體   English   中英

實體框架-使用.include()和.Select()進行“緊急加載”-如何使用左聯接而不是內聯接?

[英]Entity Framework - “eager loading” using .Include() and .Select() - how to use a LEFT JOIN rather than INNER JOIN?

這是我正在使用.NET 4.0在Entity Framework 5.0.0 RC(代碼優先)中進行的查詢

我是Entity Framework的新手,所以我仍然在設法構造查詢方面,尤其是在選擇與“子”相關的數據方面。

我正在使用“緊急加載”,因此我可以一次獲取所有相關數據。 但是我有一個問題,因為並不是所有的Drops都可以被檢索到。

var loads = context.Loads
            .Include(
                p => p.Device
            )
            .Include(
                p => p.Drops.Select(
                    a => a.Customer
                )
            ).Include(
                q => q.Drops.Select(
                   b => b.Items.Select(
                       c => c.Product
                   )
                )
            ).Where(
                u => u.Id.Equals(id)
            );

問題在於,在生成的SQL查詢中,客戶被內聯到Drops中,因此排除了沒有Customer的Drops。

那么,如何在這兩個實體之間進行LEFT JOIN?

.include似乎做左連接-那么為什么不選擇。

除了.Select之外,還有其他方法可以使用LEFT JOIN嗎?


更新

與Amiram聊天之后,我意識到我沒有正確設置Drop模型。 我需要將CustomerID列設置為可選:

public class Drop
{
    public int Id { get; set; }
    public int? CustomerId { get; set; }
    public int LoadId { get; set; }
    public DateTime Date { get; set; }

    public virtual Customer Customer { get; set; }
    public virtual ICollection<DropItem> Items { get; set; }
}

我應該立即想到這一點,但老實說,不管模型之間的基數如何,.include()總是會進行左聯接,這一事實使我感到不滿意。 我在想.Select()必須具有類似的行為,但是不,它只是服從於模型的配置方式:)

由於Drop.CustomerID的類型為int而不是可為null的int(在聊天中查找),因此drop與客戶內部連接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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