2016-06-13 31 views
1

私は次のようなクエリを持っています(私の実際のクエリにはこのような3つのセクションがあり、次にConcatがあり、いくつかの追加フィルタと並べ替えが適用されます)。ネストされたクエリはサポートされていません

var articles = from p in Repository.Query<Product>() 
       let article = p.Article 
       let office = p.TariffCategory.Office 
       where p.IsDeleted == false 
       select new 
       { 
        OfficeId = office.Id, 
        Office = office.Name, 
        Category = p.TariffCategory.Description, 
        ArticleId = article.Id, 
        Article = article.Title, 
        Destinations = p.ProductDestinations.Select(d => new { Id = d.DestinationId, Name = d.Destination.Description }), 
        GlobalDestinations = p.AllDestinationsInOffice, 
        article.LastReviewedDate, 
        article.CreatedDate, 
        article.CreatedByEmployee 
       }; 

Destinationsへの私の割り当てを除くすべてのものが正しいようです。その行は次のエラーを生成します。

ネストされたクエリはサポートされていません。 Operation1 = 'UnionAll' Operation2 = 'MultiStreamNest'

この行を削除すると、すべて正常に動作します。このようなクエリを実行する方法はありますか?

+0

私は他の2つのクエリーのうちの1つの出力が、エラーを与えている行のオブジェクトの1つと同じ名前であるように見えます。 – jdweng

+0

@jdweng:どの出力が同じですか? –

+0

宛先はコードのどこか他を定義していますか?たぶんクラス名。たぶん、説明はコードのどこかで使用されます。 – jdweng

答えて

1

私は少し考えましたが、提案したように結合するのではなく、ProductDestinationでクエリを開始すると意味があります。私たちが興味を持っているのは、通常のSQLクエリで見られるように、各製品+ターゲットの組み合わせの行です。我々はそれを持ってたら、我々はあなたが

var data = Repository.Query<ProductDestination>() 
    .Where(pd => !pd.Product.IsDeleted) 
    .Select(pd => 
    new { 
     Product = pd.Product, 
     Destination = pd.Destination, 
    }) 
    .GroupBy(pd => pd.Product) 
    //I'm not in a position to test if EF will successfully run the below, so .ToList() 
    //May not be required. However, the bulk of the work is done in the database, anyway. 
    //.ToList() 
    .Select(g => new { 
     OfficeId = g.Key.TariffCategory.Office.Id, 
     Office = g.Key.TariffCategory.Office.Name, 
     Category = g.Key.TariffCategory.Description, 
     ArticleId = g.Key.Article.Id, 
     Article = g.Key.Article.Title, 
     Destinations = g.Select(gg => new { Id = gg.Destination.DestinationId, Name = gg.Destination.Description }), 
     GlobalDestinations = g.Key.AllDestinationsInOffice, 
     g.Key.Article.LastReviewedDate, 
     g.Key.Article.CreatedDate, 
     g.Key.Article.CreatedByEmployee 
    }); 

を持っていた表現に近いだように、我々は結果をグループ化適用することができます私は上記のToList()なし作業が必要がありますが、私は」かなり確信していますそれが100%ということは自信がない。しかし、言及したように、作業の大半はデータベースで行われ、最終的な投影はメモリー内で実行されたとしてもあまり集中的ではありません。ただし、ToList()が必要な場合は、Keyで選択したすべてのフィールドを返すようにGroupByを変更する必要があります。そうしないと、遅延ロードとN + 1クエリに関する問題が発生します。

+0

それはうまくいくようです、ありがとう。私は 'GroupBy'を使用して、参照を検索せずにこれを行うのに十分です。 (そして、そうです、 'ToList()'が必要でした。) –

関連する問題