2016-06-29 11 views
0

方法を認識しない、私はその集計一部に問題があります。私はこのLINQクエリを持って集計

Adresses = m.RelatedMultipleWorks.Count == 0 ? 
     m.RelatedCity + " + " + m.RelatedCounty + " + " + m.RelatedDistrict + " + " + 
     m.RelatedNeighborhood + " + " + m.RelatedStreet + " + " + m.Road : 
     m.RelatedCity + " + " + m.RelatedCounty + " + " + m.RelatedDistrict + " + " + 
     m.RelatedNeighborhood + " + " + m.RelatedStreet + m.RelatedRoad + " | " 
     m.RelatedMultipleWorks.Select(z => z.RelatedCity + " + " + z.RelatedCounty + " + " + 
     z.RelatedDistrict + " + " + z.RelatedNeighborhood + " + " + z.RelatedStreet + " + " + z.RelatedRoad) 
      .Aggregate((current, next) => current + " | " + next), 

をそして私はこの例外を取得します。

{ "エンティティにLINQは ' 集合[文字列](System.Collections.Generic.IEnumerable 1[System.String], System.Func 3 [可能System.String、可能System.String、可能System.String])を可能System.String' メソッドを認識しませんこのメソッドをストア式に変換することはできません。」}

なぜこの例外が発生しますか?どうすればそれを取り除くことができますか?ありがとう。

.AsEnumerable().Aggregate((current, next) => current + " | " + next); 

OR:

+0

全体のLINQクエリを表示します。これはちょっとです。 – Maarten

+0

@Maarten私はより多くのクエリを追加しました。十分でない場合は、どの部分を欲しいか教えてください。 – jason

答えて

1

問題は.Aggregate()コールは、いくつかのタイプに投影の一部であるということです、投影内に.ToList()コールを追加すると、その投影がとして全体として変換されるため、機能しません。投影の半分をSQLに変換するようにEFに指示することはできず、残りの半分をSQLに変換するように指示することはできません。投影を2つの部分に分割し、最初の部分を翻訳するようにEFに指示しますが、2番目の部分は翻訳しないように指示する必要があります。

これを解決するために、現時点では、このようなことがあります。私は具体的にすることはできません、あなたは完全なクエリを表示しないので、あなたのクエリとは異なるでしょう。投影に.Aggregate()コールを排除するために

var result = ctx.SomeTable 
    .Where(...whatever...) 
    .Select(x => new SomeEntity { 
     // lots of properties 
     Adresses = m.RelatedMultipleWorks.Count == 0 ? 
      m.RelatedCity + " + " + m.RelatedCounty + " + " + m.RelatedDistrict + " + " + 
      m.RelatedNeighborhood + " + " + m.RelatedStreet + " + " + m.Road : 
      m.RelatedCity + " + " + m.RelatedCounty + " + " + m.RelatedDistrict + " + " + 
      m.RelatedNeighborhood + " + " + m.RelatedStreet + m.RelatedRoad + " | " 
      m.RelatedMultipleWorks.Select(z => z.RelatedCity + " + " + z.RelatedCounty + " + " + 
      z.RelatedDistrict + " + " + z.RelatedNeighborhood + " + " + z.RelatedStreet + " + " + z.RelatedRoad) 
       .Aggregate((current, next) => current + " | " + next), 
     // other properties 
    }) 
    .ToList(); 

、あなたはL2Eは、データベースからそのデータを取ることができますので、そのままAggregateのデータソースを残しておく必要があります。その後、メモリ内に.Aggregate()を適用することができます。

var result = ctx.SomeTable 
    .Where(...whatever...) 
    // Change: Do not project to an entity, but to an anonymous type 
    .Select(x => new { 
     // lots of properties 
     // Change: Removed the Aggregate-part 
     Adresses = m.RelatedMultipleWorks.Count == 0 ? 
      m.RelatedCity + " + " + m.RelatedCounty + " + " + m.RelatedDistrict + " + " + 
      m.RelatedNeighborhood + " + " + m.RelatedStreet + " + " + m.Road : 
      m.RelatedCity + " + " + m.RelatedCounty + " + " + m.RelatedDistrict + " + " + 
      m.RelatedNeighborhood + " + " + m.RelatedStreet + m.RelatedRoad + " | ", 
     // Added: New property for the aggregate-datasource 
     RelatedAdresses = m.RelatedMultipleWorks 
      .Select(z => 
       z.RelatedCity + " + " + z.RelatedCounty + " + " + z.RelatedDistrict + " + " + 
       z.RelatedNeighborhood + " + " + z.RelatedStreet + " + " + z.RelatedRoad 
      ) 
     // other properties 
    }) 
    // Added: Call AsEnumerable to stop translating to SQL 
    .AsEnumerable() 
    // Added: Project again, fairly simple since all properties are already ok, but now call the Aggregate 
    .Select(x => new SomeEntity { 
     // lots of properties  
     Adresses = Adresses + RelatedAdresses.Aggregate((current, next) => current + " | " + next) 
     // other properties 
    }) 
    .ToList(); 
+0

'SomeEntity'はコードの最後の部分にありますか?ありがとう。 – jason

+0

あなたの現在のlinqクエリで持っているものと同じエンティティ/クラス。 – Maarten

+0

@jason動作しましたか?あなたが答えを受け入れてからちょうど好奇心が強い。 – Maarten

3

集計がメモリに結果をSQLに翻訳していないので、Enumerate

.ToList().Aggregate((current, next) => current + " | " + next); 
+0

.AsEnumerable()を追加しても、同じエラーが表示されます。ありがとう。 – jason

+0

@jasonクエリ全体を投稿できますか? – user3185569

+0

クエリの他の部分はこれと同じです。何百もの行を含む非常に長いクエリです。 – jason

関連する問題