gpt4 book ai didi

asp.net - Entity Framework - "eager loading"使用 .Include() 和 .Select() - 如何使用 LEFT JOIN 而不是 INNER JOIN?

转载 作者:行者123 更新时间:2023-12-02 15:55:51 25 4
gpt4 key购买 nike

这是我正在使用 .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,从而排除了没有客户的 Drops。

那么我如何让它在这两个实体之间进行 LEFT JOIN 呢?

.Include 似乎可以进行左连接 - 那么为什么不 .Select 呢?

除了 .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() 总是执行 LEFT JOIN,这一事实让我感到犹豫。我在想 .Select() 一定有一些类似的行为,但不,它只是遵循模型的配置方式:)

最佳答案

drop 与客户内部连接,因为 Drop.CustomerID 的类型为 int 并且不可为 null int(在聊天中查看)。

关于asp.net - Entity Framework - "eager loading"使用 .Include() 和 .Select() - 如何使用 LEFT JOIN 而不是 INNER JOIN?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11664532/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com