Linq to Entities查询中的.Include().Where().Select()



我有一个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
                } )
        } );

最新更新