以下代码产生错误
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(),
三元运算符有什么问题?
答案 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