8

単一のエンティティ (いくつかのナビゲーション プロパティを含む) に対するクエリがあり、それらを API クライアントが使用するモデルに投影する必要があります。基本的には次のようになります。

repository.CreateQuery<Reviews>()
  .Where(/* criteria */)
  .Select(m => new
    {
      ID = m.ID,
      Reviewers = m.IsAnonymous 
        ? m.Reviewers.Take(1).Select(r => new { Name = "Anonymous" })
        : m.Reviewers.Select(r => new { Name = r.Name })
    })

LINQ to Entities は実行時にこれを実行できません。Visual Studio デバッガーでは、例外メッセージは「指定されたメソッドはサポートされていません」です。LinqPad では、内部例外は「ネストされたクエリはサポートされていません。Operation1='Case' Operations2='Collect'」です。

これを回避する方法はありますか?この条件付きクエリのポイントはパフォーマンスの問題を解決することであるため、メモリ内のオブジェクトを取得するためにクエリを強制的に実行したくないので、L2E クエリの範囲内でこれを解決する必要があることがわかる限り、 .

更新: 投影された型は、実際のアプリケーションでは匿名ではありません。例を工夫するのが便利だったので、ここでは匿名のものを使用しました。同様に、実際のクエリには多数の追加プロパティが含まれます。これは、マップされたテーブルから得られるデータが大幅に増えることを意味します。

4

1 に答える 1

5

ユニオンを使用して、必要なことを行うことができます。

var query1 = repository.CreateQuery<Reviews>()
                       .Where(/* criteria */);
var queryAnonimous = query1.Where(m=>m.IsAnonymous)
                           .Select(m => new
                                        {
                                            ID = m.ID,
                                            Reviewers = m.Reviewers.Take(1).Select(r => new { Name = "Anonymous" })        
                                        })

var queryNotAnonymous =  query1.Where(m=>!m.IsAnonymous)
                               .Select(m => new
                                            {
                                                ID = m.ID,
                                                Reviewers = m.Reviewers.Select(r => new { Name = r.Name })
                                            })
var unionQuery = queryAnonimous.union(queryNotAnonymous);
于 2012-12-19T07:00:14.620 に答える