【问题标题】:.Include() .Where() .Select() in Linq to Entities Query.Include() .Where() .Select() 在 Linq to Entities 查询中
【发布时间】:2013-12-18 12:29:01
【问题描述】:

我有一个 Linq 查询来查询以下表格:具有一对多链接的任务:TaskLinks 和 TaskLinks 具有指向名为实体的表的一对一链接。

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

这是我的 Linq 查询:

Tasks.Where(t => t.AccessLevel <= 5)
     .Include(tl => tl.TaskLinks.Where(tl2=> tl2.IfInactive == false)
     .Select(tls => tls.Entity))

我在 LinqPad 中运行此查询,我收到以下我不理解的错误:

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

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

提前谢谢你!!

鲍勃

【问题讨论】:

  • 如果您只需要Entity,您可以Join 表格并按AccessLevelIfInactive 过滤。

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


【解决方案1】:

.Include(...)“建议”查询提供者急切加载导航属性。在这种情况下,它不会这样做 b/c 您的结果不是 Task 实体,它们是 Entity 实体。

在任何情况下,您都不会在包含语句中过滤集合导航属性(这是导致错误的原因)。

您想要以下内容:

// 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
                } )
        } );

【讨论】:

  • 我在 LinqPad 中运行了它,我得到的是一个实体列表,其中包含任务链接的导航属性和任务的导航属性。原始查询正好相反(这是我们需要的)一个任务列表,具有任务链接的导航属性,以及它们的实体的导航属性。我哪里错了?
  • 删除Select并添加对.GroupBy( tl =&gt; tl.Task )的调用,这会将过滤后的TaskLists按Task分组。然后投影您想要预加载的结果。在我的解决方案中尝试更新后的查询
  • 谢谢。我想我们快到了!!我认为我们唯一缺少的是完整的任务(我现在得到的只是任务的导航属性)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-23
  • 2012-01-02
  • 2011-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多