实体框架中的嵌套查询

yqi*_*qit 26 c# linq entity-framework

我收到以下异常:

不支持嵌套查询.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
    )))
})
Run Code Online (Sandbox Code Playgroud)

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

usr*_*usr 30

你高估了LINQ转换到SQL的能力.并非一切都是可翻译的,并且由于LINQ的工作方式,没有编译器警告.

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

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

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

  • 我认为你关于三元"?:"运算符的最后一段比你想象的更重要 - 这正是我得到与提问者相同的例外的原因.顺便说一下,谢谢你的回答. (9认同)

N73*_*73k 14

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

context.Games.Select(g => new
{
    Field = g.IsX? queryable1 : queryable2
});
Run Code Online (Sandbox Code Playgroud)

但是,这是一个你可以使用它来工作的黑客:

context.Games.Select(g => new
{
    Field = queryable1.Where(q => g.IsX)
               .Concat(queryable2.Where(q => !g.IsX))
});
Run Code Online (Sandbox Code Playgroud)