实体框架中的嵌套查询
本文关键字:嵌套 查询 框架 实体 | 更新日期: 2023-09-27 18:01:43
我得到以下异常:
不支持嵌套查询。Operation1 ="案例"Operation2 ="收集"
使用这个查询
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
)))
})
当我在选择成员时不包含条件时,查询工作正常。是否有一种方法可以在查询中执行条件?
您高估了LINQ转换为SQL的能力。并不是所有的东西都是可翻译的,由于LINQ的工作方式,没有编译器警告。
嵌套集合通常要么a)不支持,要么b)以可怕的SELECT N+1查询告终。你要求EF做的是返回一个对象树。SQL不支持树状结果,所以你会遇到对象-关系阻抗不匹配,这会很痛苦。我建议您将嵌套的集合数据作为第二个完全独立的查询来获取。这允许你更多的控制,并保证工作。
作为一个不必要的边注,您可能无法说服EF在序列上使用?:操作符。这很难翻译。想想你将如何把它写成SQL——非常困难和复杂。
看起来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))
});
我也面临同样的问题。解决方案是加载两个结果,并确定在查询之后使用(我知道它有性能缺点),但至少您可以在最后期限攻击时临时执行:
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
,使Type == 1
赋值为Members = MembersOfType2
。
我也有这个错误。我有这样的代码:
var Games = context.Games.Select(a => new GameModel
{
Members = (!filters.GetDatailedDataToo ? null : new List<MemberModel>())
};
当? :
操作使用null
时,出现此错误。
这不是那种情况,写在这里,但我浪费了很多时间,我想任何人都使用这种情况,谁搜索这个错误文本。