相关疑难解决方法(0)

EF:包含where子句

正如标题所示,我正在寻找一种方法来将where子句与include结合使用.

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

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

在当前的代码中:

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);
   }
}
Run Code Online (Sandbox Code Playgroud)

在此代码之后,处理Context,并且在调用方法中,生成的Bus实体被映射到DTO类(实体的100%副本).

此代码导致多次调用DB,这是一个禁止,所以我在MSDN博客上找到了这个解决方案

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

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

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

有没有其他方式来获得活跃的乘客?

任何提示都是受欢迎的......

编辑

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();
Run Code Online (Sandbox Code Playgroud)

EDIT2

经过很多努力,格特阿诺德的答案奏效了!正如Gert Arnold建议您需要禁用延迟加载并将其保持关闭状态.这将要求对应用程序进行一些额外的更改,因为上一代开发人员喜欢Lazy Loading -_-

c# entity-framework include where-clause

45
推荐指数
3
解决办法
5万
查看次数

标签 统计

c# ×1

entity-framework ×1

include ×1

where-clause ×1