31

我收到以下异常:

不支持嵌套查询。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
    )))
})

当我在选择成员时不包括条件时,查询工作正常。有没有办法可以在查询中执行条件?

4

4 回答 4

38

您高估了 LINQ 转换为 SQL 的功能。并非所有内容都是可翻译的,并且由于 LINQ 的工作方式,因此没有编译器警告。

嵌套集合通常要么 a) 不受支持,要么 b) 以可怕的 SELECT N+1 查询告终。您要求 EF 做的是返回一个对象树。SQL 不支持树状结果,因此您会遇到对象关系阻抗不匹配的问题,这很痛苦。

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

作为一个非必要的旁注,您可能无法说服 EF 使用 ?: 运算符而不是序列。这很难翻译。想一想您将如何将其编写为 SQL - 非常困难且令人费解。

于 2013-03-01T22:56:41.823 回答
17

看起来 Linq to EF 不支持以下内容

context.Games.Select(g => new
{
    Field = g.IsX? queryable1 : queryable2
});

但是,您可以使用以下 hack 来使其工作:

context.Games.Select(g => new
{
    Field = queryable1.Where(q => g.IsX)
               .Concat(queryable2.Where(q => !g.IsX))
});
于 2016-12-22T00:33:15.347 回答
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 = MembersOfType2Type == 1

于 2016-08-24T19:54:27.490 回答
2

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

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

null运行中使用时出现此错误? :

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

于 2018-05-08T06:05:28.380 回答