我有一个查询以下表的Linq查询:具有一对多链接的任务:TaskLinks和TaskLinks具有指向实体的表的一对一链接。
我正在尝试选择任务,急切加载(通过.Include)TaskLinks并选择链接到TaskLink的实体。但是我需要过滤Task(通过Access Level int)和TaskLinks,这样我就不会包含任何Inactive(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运算符作为集合导航属性。 参数名称:路径
如何重新编写此查询以便我可以过滤包含的任务链接,并选择实体?
提前谢谢!!
鲍勃
答案 0 :(得分:2)
.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
} )
} );