【发布时间】:2016-12-24 13:12:48
【问题描述】:
我有一个对象,它的属性是另一个对象的集合。我想使用 LINQ 加载集合属性的一个子集。
这是我的尝试:
manager = db.Managers
.Include(m => m.Transactions.Skip((page - 1) * 10).Take(10))
.Where(m => m.Id == id)
.FirstOrDefault();
上面的代码抛出一个错误,上面写着
包含路径表达式必须引用在类型上定义的导航属性。对引用导航属性使用虚线路径,对集合导航属性使用 Select 运算符。\r\n参数名称:路径
在 LINQ 中执行此操作的正确方法是什么?提前致谢。
【问题讨论】:
-
对于给定的经理,平均而言是否有很多事务?换句话说,您对性能的关注程度如何?如果不是太多,您可以进行预加载,然后正常使用 Skip 和 Take 进行过滤。
-
@BrunoSaboia 感谢您的回复。是的。经理可以有很多事务。加载所有事务会减慢应用程序的速度。我相信我已经在使用急切加载,但我不太确定“使用跳过并正常进行过滤”。我该怎么做?
-
Rian,你不是在使用急切加载,而是在使用延迟加载。急切加载将加载给定管理器的所有事务。我看到您可能不想使用急切加载,因为每个经理有很多事务。我会考虑一个尊重您需求的解决方案,然后回到这里
-
@BrunoSaboia .Include 表达式是预加载的定义。 msdn.microsoft.com/en-us/library/jj574232(v=vs.113).aspx 延迟加载将只调用 manager.Transactions 而不包含。 Rian:是的,请禁用延迟加载。这是性能测试的噩梦,这是 IMO 一些人认为 EF 速度慢的最大原因。特别是如果您与经验不足的同事一起工作。如何禁用延迟加载可以在这里找到:stackoverflow.com/questions/2967214/…
-
@BrunoSaboia 我已经关闭了延迟加载。这就是我使用 .include 的原因。 hvd 在下面发布了一个可行的解决方案。