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はツリーのような結果をサポートしていないため、オブジェクトとリレーショナルのインピーダンスの不一致が発生し、問題が発生します。

ネストされたコレクションデータを、完全に別個の2番目のクエリとしてフェッチすることをお勧めします。これにより、より詳細な制御が可能になり、動作が保証されます。

本質的ではない補足として、シーケンスに対して?:演算子を使用するようにEFを説得することはおそらくできないでしょう。それを翻訳するのは非常に難しいです。これをSQLとしてどのように書くかを考えてください-非常に難しく複雑です。

于 2013-03-01T22:56:41.823 に答える
17

LinqtoEFは以下をサポートしていないようです

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))
});
于 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 に答える