gpt4 book ai didi

c# - EF : Include with where clause

转载 作者:IT王子 更新时间:2023-10-29 03:57:29 25 4
gpt4 key购买 nike

<分区>

正如标题所暗示的那样,我正在寻找一种结合包含的 where 子句的方法。

这是我的情况:我负责支持一个充满代码味道的大型应用程序。更改太多代码会导致到处都是错误,因此我正在寻找最安全的解决方案。

假设我有一个对象 Bus 和一个对象 People(Bus 有一个导航 Prop Collection of People)。在我的查询中,我需要选择所有只有醒着的乘客的公共(public)汽车。这是一个简单的虚拟示例

在当前代码中:

var busses = Context.Busses.Where(b=>b.IsDriving == true);
foreach(var bus in busses)
{
var passengers = Context.People.Where(p=>p.BusId == bus.Id && p.Awake == true);
foreach(var person in passengers)
{
bus.Passengers.Add(person);
}
}

在此代码之后,上下文被释放,并且在调用方法中,生成的总线实体被映射到 DTO 类(实体的 100% 副本)。

此代码导致多次调用 DB,这是不可行的,因此我找到了此解决方案 ON MSDN Blogs

这在调试结果时效果很好,但是当实体映射到 DTO(使用 AutoMapper)时,我得到一个异常,上下文/连接已关闭并且无法加载对象。 (上下文总是关闭不能改变这个 :( )

所以我需要确保 Selected Passengers 已经加载(导航属性上的 IsLoaded 也是 False)。如果我检查 Passengers 集合,Count 也会抛出异常,但 Passegers 集合中还有一个称为“包装相关实体”的集合,其中包含我过滤的对象。

有没有办法将这些包装的相关实体加载到整个集合中?(我无法更改自动映射器映射配置,因为整个应用程序都在使用它)。

是否有其他方法来获取活跃乘客?

欢迎任何提示...

编辑

Gert Arnold 的回答不起作用,因为数据没有急切加载。但是当我简化它并删除它的加载位置时。这真的很奇怪,因为在这两种情况下执行 sql 都会返回所有乘客。所以把结果放回实体的时候一定有问题。

Context.Configuration.LazyLoadingEnabled = false;
var buses = Context.Busses.Where(b => b.IsDriving)
.Select(b => new
{
b,
Passengers = b.Passengers
})
.ToList()
.Select(x => x.b)
.ToList();

编辑2

经过一番努力,Gert Arnold 的答案大功告成!正如 Gert Arnold 建议的那样,您需要禁用延迟加载并将其保持关闭状态。这将要求对应用程序进行一些额外的更改,因为以前的开发人员喜欢延迟加载 -_-

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