entity framework中的嵌套查询

我收到以下exception:

不支持嵌套查询。 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的强大function。 并非所有内容都是可翻译的,并且由于LINQ的工作方式,没有编译器警告。

嵌套集合通常是a)不支持或b)最终可怕的SELECT N + 1查询。 你要求EF做的是返回一个对象树。 SQL不支持树状结果,因此您遇到对象关系阻抗不匹配而且会受到伤害。

我建议你将嵌套的集合数据作为第二个完全独立的查询来获取。 这使您可以更好地控制并保证工作。

作为一个非必要的侧节点,您可能无法说服EF在序列上使用?:运算符。 这很难翻译。 想想你如何把它写成SQL – 非常困难和复杂。

看起来Linq到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)) }); 

我遇到了同样的问题。 解决方案是加载两个结果并确定查询后要使用的内容 (我知道它有性能下降),但至少你可以暂时执行它,如果截止日期攻击你:

在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 }))) }) } 

之后,如果Type == 1 ,您可以循环Games并进行分配Members = MembersOfType2

我也有这个错误。 我有这样的代码:

 var Games = context.Games.Select(a => new GameModel { Members = (!filters.GetDatailedDataToo ? null : new List()) }; 

使用null时会发生此错误? : ? :操作。

这不是写在这里的情况,但我浪费了很多时间,我想任何人都会使用这个案例,谁搜索这个错误文本..