C# .Include().Where().Select()在Linq to实体查询中

C# .Include().Where().Select()在Linq to实体查询中,c#,sql,entity-framework,linq-to-entities,C#,Sql,Entity Framework,Linq To Entities,我有一个Linq查询,用于查询以下表:具有一对多链接的任务:TaskLinks和TaskLinks具有一对一链接到名为Entities的表 我正在尝试选择任务、加载(通过.Include)TaskLink并选择链接到TaskLink的实体。但是我需要过滤任务(按访问级别int)和任务链接,以便不包含任何非活动(bool)记录 以下是我的Linq查询: Tasks.Where(t => t.AccessLevel <= 5) .Include(tl => tl.Task

我有一个Linq查询,用于查询以下表:具有一对多链接的任务:TaskLinks和TaskLinks具有一对一链接到名为Entities的表

我正在尝试选择任务、加载(通过.Include)TaskLink并选择链接到TaskLink的实体。但是我需要过滤任务(按访问级别int)和任务链接,以便不包含任何非活动(bool)记录

以下是我的Linq查询:

Tasks.Where(t => t.AccessLevel <= 5)
     .Include(tl => tl.TaskLinks.Where(tl2=> tl2.IfInactive == false)
     .Select(tls => tls.Entity))
Tasks.Where(t=>t.AccessLevel tl.TaskLinks.Where(tl2=>tl2.IfInactive==false)
.Select(tls=>tls.Entity))
我在LinqPad中运行此查询,得到了以下我不理解的错误:

ArgumentException:包含路径表达式必须引用在类型上定义的导航属性。使用虚线路径作为参考导航属性,选择运算符作为集合导航属性。 参数名称:路径

如何重新编写此查询,以便筛选包含的TaskLink并选择实体

提前谢谢你

Bob

.Include(…)
向查询提供程序“建议”以立即加载导航属性。在这种情况下,它不会这样做b/c您的结果不是
任务
实体,而是
实体
实体

在任何情况下,都不会在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
                } )
        } );
//从任务开始,按访问级别筛选
Tasks.Where(t=>t.AccessLevel t.TaskLinks)
//按IfInactive==false筛选任务链接
.Where(tl=>!tl.IfInactive)
//更新以保留所需的层次结构
.GroupBy(tl=>tl.Task)
.选择(g=>new
{
任务=g.键,
FilteredTaskLists=g.Select(tl=>new
{
任务列表=tl,
实体=tl.实体
} )
} );

如果您只需要
实体
,您可以
加入
表,并通过
AccessLevel
IfInactive
进行筛选。我在LinqPad中运行了此操作,得到的是一个实体列表,其中包含任务链接的导航属性和任务的导航属性。最初的查询与任务列表正好相反(这正是我们所需要的),任务链接有一个导航属性,实体有一个导航属性。我哪里出错了?删除
选择
并添加对
.GroupBy(tl=>tl.Task)
的调用,该调用将按
任务对筛选的
任务列表
进行分组。然后投影要加载的结果。请在我的解决方案中尝试更新的查询谢谢。我想我们快到了!!我认为我们唯一缺少的是完整的任务(我现在得到的只是任务的导航属性)