[英]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.