使用实体框架 4.3 的过滤器加载导航属性

2024-02-27

几天前我放了一个question https://stackoverflow.com/questions/11168505/auditing-a-table-with-ef-code-first关于映射两个类Message and MessageStatusHistory使用EF。映射进展顺利,但我在导航属性方面遇到了一些问题StatusHistory在班上Message这与它有关MessageStatusHistory对象。我只为一个用户加载消息,并且只想要与该用户相关的状态。就像我想显示用户是否将消息标记为已读/未读以及何时标记。如果我使用默认加载机制(如下所示),它将加载与消息相关的所有历史记录,而不管用户如何:

IDbSet<Message> dbs = _repo.DbSet;
dbs.Include("StatusHistory").Where(x=>x.MessageIdentifier == msgIdentifier);

为了仅过滤一个用户的历史记录,我尝试了以下技巧:

IDbSet<Message> dbs = _repo.DbSet;
var q = from m in dbs.Include("StatusHistory")
        where m.MessageIdentifier == msgIdentifier
        select new Message
        {
            MessageIdentifier = m.MessageIdentifier,
            /*OTHER PROPERTIES*/
            StatusHistory = m.StatusHistory
                             .Where(x => x.UserId == userId).ToList()
        };

return q.ToList();//THROWING ERROR ON THIS LINE

我收到错误:

The entity or complex type 'MyLib.Biz.Message' cannot be constructed in a LINQ 
to Entities query.

我已经尝试通过评论StatusHistory = m.StatusHistory.Where(x => x.UserId == userId).ToList()也但没有帮助。

请帮助我获取带有过滤状态历史记录的消息。

EDIT:-上面的问题用这段代码解决了:

var q = from m in _repository.DBSet.Include("Histories")
        where m.MessageIdentifier == id
        select new {
                     m.Id,/*OTHER PROPERTIES*/
                     Histories = m.Histories.Where(x => 
                                   x.SenderId == userId).ToList()
                   };

var lst = q.ToList();
return lst.Select(m => new Message{
           Id = m.Id, MessageIdentifier = m.MessageIdentifier, 
           MessageText = m.MessageText, Replies = m.Replies, 
           ReplyTo = m.ReplyTo, Histories = m.Histories, SenderId = 
           m.SenderId, SenderName = m.SenderName, CreatedOn = m.CreatedOn
       }).ToList();

但如果我尝试包含对消息的回复:

from m in _repository.DBSet.Include("Replies").Include("Histories")

我在将查询转换为列表时遇到错误q.ToList() for Histories = m.Histories.Where(x=> x.SenderId == userId).ToList().


关于您的编辑部分:您不能使用ToList()在投影中,只需将其保留为IEnumerable<T>并转换为List<T>当你构造Message。您也不需要创建两个列表对象,您可以从 LINQ to Entities 查询切换到 LINQ to Objects(第二个)Select) 通过使用AsEnumerable():

var list = (from m in _repository.DBSet
            where m.MessageIdentifier == id
            select new {
                // ...
                Histories = m.Histories.Where(x => x.SenderId == userId)
            })
            .AsEnumerable() // database query is executed here
            .Select(m => new Message {
                // ...
                Histories = m.Histories.ToList(),
                // ...
            }).ToList();

return list;

意识到Include当您使用投影时没有效果select。您需要创建想要包含投影一部分的属性 - 正如您已经做的那样select new { Histories.....

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用实体框架 4.3 的过滤器加载导航属性 的相关文章

随机推荐

  • 有没有一种简单的方法来扩展现有的激活函数?我的自定义 softmax 函数返回: 操作具有“无”梯度

    我想通过仅使用向量中的前 k 个值来实现使 softmax 更快的尝试 为此 我尝试为张量流实现一个自定义函数以在模型中使用 def softmax top k logits k 10 values indices tf nn top k
  • Angular 2 组件@Input 不起作用

    我一直试图将属性值传递到我的组件中 从我读到的一切看起来都是正确的 但它仍然不起作用 我的测试值以空值输出到屏幕和控制台 这是我的测试组件 import Component Input from angular2 angular2 Comp
  • 如何检查字符串是否是全语法?

    我想创建一个函数 它接受一个字符串作为输入 并检查该字符串是否是全语法 全语法是包含字母表中每个字母的一段文本 我编写了以下代码 该代码有效 但我正在寻找一种替代方法 希望是一种简短的方法 import string def is pang
  • 从 Python 中的 code.interact() 恢复代码执行

    在使用调试时打开交互式控制台后 code interact local locals 我怎样才能恢复代码执行 我已经检查了 代码 模块和搜索堆栈溢出的文档 但找不到任何内容 这与退出任何 Python 解释器会话的方式相同 发送文件结束字符
  • 电话号码格式应该是国际格式,iPhone中是否有用于电话号码验证的正则表达式

    电话号码应该是国际电话号码 用户必须输入带有国家 地区代码的完整电话号码 为此 我需要一个正则表达式来格式化电话号码 对于真正的正则表达式测试使用正则表达式套件精简版 http regexkit sourceforge net RegexK
  • 是否可以在 _LoginPartial.cshtml 中使用 @model ?

    我需要从我的数据库获取一些数据 LoginPartial cshtml 是否可以使用 model in LoginPartial cshtml 或者说它是如何完成的 就在 using WebApp Services然后直接从服务中检索数据
  • OpenCL 编译器预处理定义?

    我正在 Snow Leopard 上开发 OpenCL 代码 并且了解 OpenCL 即时编译是由 Clang LLVM 完成的 是否使用了 C 预处理器 有没有办法使用编译器设置预处理定义 存在哪些定义 我希望代码知道它是为 CPU 还是
  • Java 8 列表到嵌套映射

    我有一个班级名单A like class A private Integer keyA private Integer keyB private String text 我要转让aList嵌套Map映射于keyA and keyB 所以我创
  • 正则表达式的金钱

    I have asp TextBox保持货币价值 即 1000 1000 0 和 1000 00 由于俄罗斯标准 逗号是分隔符 What ValidationExpression我要使用适当的asp RegularExpressionVal
  • 如何指定 RTL 特定的可绘制对象

    我有几张从右到左看起来不同的图像 是否可以创建 rtl 特定的可绘制目录或文件名的一些 rtl 后缀以自动加载相关图像 看起来像 ldrtl 后修复 从 17 级添加 仅适用于布局目录 现在回答这个问题已经很晚了 但我想分享一个我刚刚发现的
  • 有人用 VS2010 RTM 编译 OverviewMargin 吗?

    由于我严重上瘾岩石卷轴 http www hanselman com blog IntroducingRockScroll aspx 我正在寻找一个替代品 https stackoverflow com questions 2672277
  • 让Java文件传输更高效

    我有两台无线计算机连接到 N 个无线路由器 每台 PC 的连接速度都在 108 150Mbps 之间 理论上 在绝对最佳的条件下 我应该能够以 13 5MB s 到 18 75MB s 的速度传输 第一台计算机 正在发送 使用非常快的 SS
  • Android 模拟器上的低功耗蓝牙

    我研究了关于蓝牙低功耗 http developer android com guide topics connectivity bluetooth le html 但我没有支持 BLE 设备进行测试 因此 我想问 Android模拟器支持
  • 如何使用 JavaScript 将图像转换为 Base64 字符串?

    我需要将图像转换为 Base64 字符串 以便可以将图像发送到服务器 有没有相关的 JavaScript 文件 否则 我该如何转换它 您可以选择多种方法 1 方法 FileReader 通过以下方式将图像加载为 blobXMLHttp请求
  • 为什么弹性项目受限于父级尺寸?

    考虑以下示例 body margin 0 box sizing border box parent min height 100vh width 50vw margin 0 auto border 1px solid red display
  • 过滤传出 SignalR Core Hub 消息

    我正在使用 SignalR 和 Net 5 0 并利用集线器过滤器 https learn microsoft com en us aspnet core signalr hub filters view aspnetcore 5 0对我的
  • 如何使批处理文件删除它自己的目录?

    好吧 我很抱歉我对此很陌生 但我试图让我的批处理文件在启动后删除它自己的目录 这是我的文件夹的排列方式 Folder1 删除 bat 我的目标是让 delete bat 在启动 delete bat 后删除 Folder1 这是我的代码 r
  • 等待文件可写

    我正在开发一个将数据写入文件的工具 在某些时候 文件可能会被 锁定 并且在其他句柄关闭之前不可写入 我可以使用CreateFileAPI 处于循环状态 直到文件可用于写入访问 但我有两个问题使用CreateFile循环中 硬盘驱动器 缓存
  • 我们如何覆盖 navigator.getBattery()?

    我们正在编写一个 Chrome 扩展 当运行客户端代码的站点出于指纹识别原因检查电池电量时 该扩展会返回随机电池电量 站点可以使用的示例代码如下所示 navigator getBattery then function battery co
  • 使用实体框架 4.3 的过滤器加载导航属性

    几天前我放了一个question https stackoverflow com questions 11168505 auditing a table with ef code first关于映射两个类Message and Messag