Lin中的.Include()。Where().Select()实体查询

时间:2013-12-02 17:34:48

标签: c# sql entity-framework linq-to-entities

我有一个查询以下表的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运算符作为集合导航属性。 参数名称:路径

如何重新编写此查询以便我可以过滤包含的任务链接,并选择实体?

提前谢谢!!

鲍勃

1 个答案:

答案 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
                } )
        } );