2012-03-06 8 views
2

良い一日の方法を認識しない、System.Linq.Select方法エラー:エンティティへのLINQは

私のコードは、実行時エラーが発生し、私はこの問題を解決するかどうかはわかりません。どんな助けもありがとう。

私たちのコードは、「オファー」のリストを渡すことによって、以下の2番目のConvertメソッドを呼び出しています。オファーは、EDMXモデルのオブジェクトです。最初のConvertメソッドはオブジェクトを取得し、それをDTOクラスに変換して戻します。

プログラムを実行しているとき、私は次のようなエラーが発生します。

LINQ to Entities does not recognize the method '...Domain.Holdings.OfferDto Convert(...Repository.Offer, System.Nullable`1[System.Int32])' method, and this method cannot be translated into a store expression.

次のようにコードが見えます:

public class OfferDtoMapping 
{ 
    public static OfferDto Convert(Offer offer, int? participantId) 
    { 
     if (offer == null) 
      throw new ArgumentException("The Offer object supplied for conversion cannot be null"); 

     var unitCost = offer.UnitCost; 
     if (offer.Trust.Company.AllowInterDiv && participantId.HasValue) 
     { 
      Assign another value to unitCost... 
     } 

     var output = new OfferDto 
     {    
      Assign the offer properties to the OfferDto properties... 
     }; 
     return output;   
    } 

    public static IList<OfferDto> Convert(IQueryable<Offer> offerList) 
    { 
     return offerList == null ? new List<OfferDto>() : offerList.Select(ol => Convert(ol, null)).ToList(); 
    } 
} 

エラーは、この行で発生します

return offerList == null ? new List<OfferDto>() : offerList.Select(ol => Convert(ol, null)).ToList(); 

私はエラーは、私が2inpを取る方法でofferListを投影しているという事実と関係していると思われるutパラメータ。私たちはNULLの代わりに0を渡そうとしました(当初はそれが問題だと思っていたからです)。しかし、同様のエラーメッセージが表示されます。当社のソリューション全体の一貫性を維持するために

我々はSelectメソッドを使用しての代わりに、foreach文でこれを置き換えておきたいです。

現在の状況でSelectメソッドを使用する方法はありますか?

ありがとうございます。エンティティへ

答えて

2

エンティティへのLinqのConvertメソッドの変換がないため、エラーが発生します。 IqueryableデータのToList()を呼び出すことによって、まずデータの評価を強制する必要があります。変換はLinqの外部でメモリ内のEntitesに対して実行できます。

return offerList == null ? new List<OfferDto>() : offerList.ToList().Select(ol => Convert(ol, null)).ToList(); 
+0

優れた、あなたに感謝して、このような迅速な回答をありがとうございました。私はそれをテストし、それは動作します。 – Matei

+0

'ToList()'の代わりに 'AsEnumerable()'を使うこともできます。これは、リストを2回割り当てる必要がないため、より効率的です。 – svick

2

LINQのは、あなたの基本的なデータベースのための有効な式にあなたのSelect文を変換しようとします。それはあなたのConvertメソッドを知ることができないので、この変換は失敗し、エラーが表示されます。

これは、LinqにオブジェクトにSelect文を処理させることで解決できます。メモリにDBから

return offerList == null ? new List<OfferDto>() : offerList.ToList() 
                .Select(ol => Convert(ol, null)) 
                .ToList() 

offerList.ToList() fetchsデータ、そしてあなた:あなたはlinq2objectでこれを行うことができますlinq2entitiesからメソッドを呼び出すので、最初にデータをフェッチしてからメソッドを呼び出すことはできません

offerList.ToList().Select(ol => Convert(ol, null)); 
2

linq2objectメソッドを実行するだけで済みます。実際、いくつかの定義済みのシステムメソッドはlinq2entityから呼び出すことができ、ユーザ定義メソッドは許されません(linq2sqlは式ツリーを作成できないため)。

関連する問題