我收到以下异常:
不支持嵌套查询。 Operation1 ='Case'Operation2 ='Collect'
使用此查询
var Games = context.Games.Select(a => new GameModel
{
Members = (a.Type == 1 ? (a.UsersInGames.Where(b => b.GameID == a.ID && b.StatusID == 1).Select(c => new Member
{
ID = c.UserID,
email = c.UserInfo.EmailAddress,
screenName = c.UserInfo.ScreenName
})) :
(a.Teams.Where(b => b.GameID == a.ID).SelectMany(b => b.UsersInTeams.Where(c => c.StatusID == 1)).Select(d => new Member
{
ID = d.UserID,
email = d.UserInfo.EmailAddress,
screenName = d.UserInfo.ScreenName
)))
})
当我在选择成员时不包括条件时,查询工作正常。有没有办法在查询中做条件?
答案 0 :(得分:29)
你高估了LINQ转换为SQL的能力。并非一切都是可翻译的,并且由于LINQ的工作方式,没有编译器警告。
嵌套集合通常是a)不支持或b)最终可怕的SELECT N + 1查询。你要求EF做的是返回一个对象树。 SQL不支持树状结果,因此您遇到对象关系阻抗不匹配并且会受到伤害。
我建议你把嵌套的集合数据作为第二个完全独立的查询来获取。这样可以让您更好地控制并确保工作。
作为一个非必要的侧节点,您可能无法说服EF在序列上使用?:运算符。这很难翻译。想想你如何把它写成SQL - 非常困难和复杂。
答案 1 :(得分:14)
看起来Linq to EF不支持以下
context.Games.Select(g => new
{
Field = g.IsX? queryable1 : queryable2
});
但是,这是一个可以用它来实现它的黑客攻击:
context.Games.Select(g => new
{
Field = queryable1.Where(q => g.IsX)
.Concat(queryable2.Where(q => !g.IsX))
});
答案 2 :(得分:3)
我遇到了同样的问题。解决方案是加载两个结果并确定在查询后使用 >>(我知道它有性能下降),但至少如果截止日期攻击你,你可以暂时做到这一点:
在LINQ方面
var Games = context.Games.Select(a => new GameModel
{
// carries type1 results
Members = a.UsersInGames.Where(b => b.GameID == a.ID && b.StatusID == 1).Select(c => new Member
{
ID = c.UserID,
email = c.UserInfo.EmailAddress,
screenName = c.UserInfo.ScreenName
})),
//You need to create this temporary carrier to carry type 2 results
MembersOfType2 = a.Teams.Where(b => b.GameID == a.ID).SelectMany(b => b.UsersInTeams.Where(c => c.StatusID == 1)).Select(d => new Member
{
ID = d.UserID,
email = d.UserInfo.EmailAddress,
screenName = d.UserInfo.ScreenName
})))
})
}
之后,您可以循环Games
并为某个游戏设置Members = MembersOfType2
Type == 1
。
答案 3 :(得分:0)
我也有这个错误。我有这样的代码:
var Games = context.Games.Select(a => new GameModel
{
Members = (!filters.GetDatailedDataToo ? null : new List<MemberModel>())
};
null
操作中使用? :
时会发生此错误。
这不是写在这里的情况,但是我浪费了很多时间,我想任何人都会使用这个案例来搜索这个错误文本..