我有一个Linq查询,它查询以下表:具有一对多链接的任务:TaskLinks和TaskLinks具有一对一链接,链接到名为Entities的表。
我正在尝试选择任务,急切地加载(通过.Include)TaskLinks并选择链接到TaskLink的实体。但我需要过滤Task(按访问级别int)和TaskLinks,这样我就不会包括任何非活动(bool)记录。
这是我的Linq查询:
Tasks.Where(t => t.AccessLevel <= 5)
.Include(tl => tl.TaskLinks.Where(tl2=> tl2.IfInactive == false)
.Select(tls => tls.Entity))
我在LinqPad中运行这个查询,得到了以下我不理解的错误:
ArgumentException:Include路径表达式必须引用在类型上定义的导航属性。对引用导航属性使用虚线路径,对集合导航属性使用Select操作符。参数名称:路径
如何重写此查询以便筛选包含的任务链接并选择实体?
提前感谢!!
Bob
.Include(...)
向查询提供程序"建议"加载导航属性。在这种情况下,它不会这样做b/c您的结果不是Task
实体,而是Entity
实体。
在任何情况下,您都不会在include语句中筛选集合导航属性(这就是导致错误的原因)。
您想要以下内容:
// start with Tasks, filter by AccessLevel
Tasks.Where( t => t.AccessLevel <= 5 )
// get the TaskLinks for each Task
.SelectMany( t => t.TaskLinks )
// filter TaskLinks by IfInactive == false
.Where( tl => !tl.IfInactive )
// update to keep the hierarchy you want
.GroupBy( tl => tl.Task )
.Select( g => new
{
Task = g.Key,
FilteredTaskLists = g.Select( tl => new
{
TaskList = tl,
Entity = tl.Entity
} )
} );