LINQ嵌套数组和三元运算符。不支持嵌套查询。 Operation1 ='案例'Operation2 ='收集'

时间:2017-02-26 10:10:10

标签: c# linq

以下代码产生错误

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(),

三元运算符有什么问题?

3 个答案:

答案 0 :(得分:3)

该例外表示您正在使用实体框架。总是很高兴在问题中提及LINQ实现。

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

因此,表达式中的Case方法不受支持(我想因此后续Collect也不受支持)。< / p>

你可以通过制作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
              })
}

答案 1 :(得分:0)

我认为你根本无法在linq查询中加入if-else,至少不在那个地方。 有关详细说明和讨论,请参阅this post

哦,特别注意&#34; hack&#34;用户AyCabron,我认为这可以整齐地解决你的情况(取决于你究竟想要什么以及为什么你选择使用空指针)。

答案 2 :(得分:0)

问题不在于Linq,而在于Linq对象。

因为您正在使用IQueryable,所以您希望查询在DB中运行, 在这种情况下,你不能使用许多运算符,包括三元运算符。

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

请参阅此处的示例:working example