【问题标题】:LINQ nested array and the ternary operator. The nested query is not supported. Operation1='Case' Operation2='Collect'LINQ 嵌套数组和三元运算符。不支持嵌套查询。 Operation1='案例' Operation2='收集'
【发布时间】:2017-02-26 10:10:09
【问题描述】:

以下代码产生错误

The nested query is not supported. Operation1='Case' Operation2='Collect'

问题是我做错了什么?我该如何解决?

IQueryable<Map.League> v = from ul in userLeagues
    select new Map.League
    {
        id = ul.LeagueID,
        seasons = 
            inc.Seasons ? (from ss in ul.Standings
                 where ss.LeagueID == ul.LeagueID
                 select new Map.Season
                 {
                      seasonId = ss.Season.SeasonId,
                      seasonName = ss.Season.SeasonName
                 }).ToList() : null,
    };

更新

我无法理解的是为什么这是一种魅力

seasons =  (from ss in ul.Standings
             where ss.LeagueID == ul.LeagueID
             select new Map.Season
             {
                 seasonId = ss.Season.SeasonId,
                 seasonName = ss.Season.SeasonName
             }).Distinct(),

三元运算符有什么问题?

【问题讨论】:

  • 由于三元运算符只是一个 if-else,它超出了 linq 的范围。所以三元运算符没有错。今天感觉很好,但恕我直言不喜欢使用:-)

标签: c# linq


【解决方案1】:

异常表明您正在使用实体框架。在问题中提及 LINQ 实现总是很好。

当 LINQ 针对 SQL 后端运行时,SQL 提供程序会尝试将整个语句转换为一个 SQL 语句。这大大减少了支持的操作类型,因为 SQL 比 LINQ 受到的限制要多得多。请注意,变量 inc.Seasons 也应该是 SQL 语句的一部分。现在的问题是,一个 SQL 不能根据一个变量返回两个不同的结果集,该变量是它自身的一部分:总是有一个固定的 SELECT 子句。

所以表达式中有一个 Case 方法在一个不受支持的地方(我猜因此后续的 Collect 也不支持)。

您可以通过将包含部分添加到 where 子句来解决此问题:

from ul in userLeagues
select new Map.League
{
    id = ul.LeagueID,
    seasons = from ss in ul.Standings
              where inc.Seasons                    // here
                 && ss.LeagueID == ul.LeagueID
              select new Map.Season
              {
                   seasonId = ss.Season.SeasonId,
                   seasonName = ss.Season.SeasonName
              })
}

【讨论】:

  • 恕我直言,您简直就是摇滚。谢谢
【解决方案2】:

我认为您根本不能将 if-else 放在 linq 查询中,至少不能放在那个地方。 详细解释和讨论见this post

哦,特别是看看用户 AyCabron 的“hack”,我认为这可以巧妙地解决您的问题(取决于您到底想要什么以及为什么选择使用空指针)。

【讨论】:

  • 看来我对三元运算符有很大的问题
  • 不确定我是否正确。你个人只异或你的昵称:-)
  • 我(个人),我尽量避免它,因为它隐藏的比它清除的多,而且错误消息中的行号变得模糊。
【解决方案3】:

问题一般不在于 Linq,而在于 Linq to objects。

由于您使用的是 IQueryable,因此您希望查询在数据库中运行, 在这种情况下,您不能使用许多运算符,包括三元运算符。

如果您使用 Linq to objects(即 Enumerable)尝试相同的代码,它将成功。

在此处查看示例:working example

【讨论】:

    【解决方案4】:

    当您在? 语句中使用null 时,EF 会生成错误The nested query is not supported. Operation1='Case' Operation2='Collect'

    EF 不能转换像condition ? object/list : null 这样的语句。

    在您的具体示例中,删除.ToList(),因为当没有行返回时它也会产生错误。当select没有项目时,EF会自动给你null

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-29
      • 1970-01-01
      • 1970-01-01
      • 2020-10-06
      相关资源
      最近更新 更多