2012-04-03 16 views
9

エンティティ・フレームワーク問合せの結果を自分のdtoクラスに戻そうとしています。列挙型TradeTypeをマッピングしています。Entity Frameworkマッピング列挙型:指定された値が 'Edm.Int32'型のインスタンスではありません。パラメータ名:値

私は「Edm.Int32」パラメータ名型のインスタンス次のエラー

指定された値がされていません取得しています:値

修正するためにどのように任意のアイデアや回避策?

おかげEntity Frameworkの投影からの投影で

public IEnumerable<Trade> GetLiveTrades(string routeName) 
{ 
    return _entities.Price.Where(p => p.StatusCode.Equals("A") && p.Period.PeriodYear <= DateTime.Now.Year+1 && p.Route.RouteCode.Equals(routeName)). 
     Select(p => new Trade 
         { 
          Volume = (long) (p.Volume ?? 100), 
          TradeType = (p.PriceTypeCode.Equals("O") ? TradeType.Seller : TradeType.Bidder), 
          Price = p.Price1, 
          TenorStartDate = p.Period.PeriodStartDate.Value, 
          TenorEndDate = p.Period.PeriodStartDate.Value, 
          TradeId = p.ID 
         }).ToList(); 
     } 

public class Trade 
{ 
    public long Volume { get; set; } 
    public TradeType TradeType { get; set; } 
    public double Price { get; set; } 
    public DateTime TenorStartDate { get; set; } 
    public DateTime TenorEndDate { get; set; } 
    public Guid TradeId { get; set; } 
} 

答えて

10

列挙型(Select)は既知の問題です。そうした場合、

_entities.Price.Where(p => p.StatusCode.Equals("A") && 
    p.Period.PeriodYear <= DateTime.Now.Year + 1 && 
    p.Route.RouteCode.Equals(routeName)).ToList() // ToList ! 
    .Select(p => new Trade ... 

普通のlinq-to-objectsによって投影が行われます。これは通常のジョブです。私は、問題の表に多くの列があるときだけダムToList()が有害であることを追加したい後半付け足しとして


EDIT

。これは、必要以上に多くのデータがクライアントに転送されることを意味します。そのような場合は、二重投影を実行すると便利です。まず、クエリー・プロバイダー・プロジェクトの受け入れ可能なタイプの範囲内。その後、最終型にLINQツーオブジェクト(AsEnumerable)プロジェクトに切り替えた後:

_entities.Price.Where(p => p.StatusCode.Equals("A") && 
    p.Period.PeriodYear <= DateTime.Now.Year + 1 && 
    p.Route.RouteCode.Equals(routeName)) 
    .Select(p => new 
       { 
        Volume = (long) (p.Volume ?? 100), 
        PriceTypeCode = p.PriceTypeCode, 
        Price = p.Price1, 
        TenorStartDate = p.Period.PeriodStartDate.Value, 
        TenorEndDate = p.Period.PeriodStartDate.Value, 
        TradeId = p.ID 
       }) 
    .AsEnumerable() 
    .Select(x => new Trade 
       { 
        Volume = x.Volume, 
        TradeType = (x.PriceTypeCode.Equals("O") ? TradeType.Seller : TradeType.Bidder), 
        Price = x.Price1, 
        TenorStartDate = x.TenorStartDate, 
        TenorEndDate = x.TenorEndDate, 
        TradeId = x.ID 
       }). 
+0

ありがとうございました。元のテキストバージョンのPriceTypeCodeを格納した内部変数を持つようにdtoを変更してから、適切な列挙型を返すようにスイッチを実行するパブリックプロパティを公開しました。少しハッキーでしたが、それは望ましい結果をもたらしました! :)。あなたの答えを応援、私はあなたの方法を使用します。 – Mantisimo

+0

これは私の問題を解決するのに役立ちました。コードをToString()のenumをクエリ外のローカル変数に変更して解決しました。 – John

+0

こんにちは@ジョン。あなたのコメントはこの投稿に私の注意を引いてくれました。 –

8

インストールの.Net 4.5が表示されますが、同様の問題を修正するために(あなたのプロジェクトはまだ4.0にすることができます)。

ステージングサーバー(開発者とテストサーバーは正常に動作しました)でこの問題が発生し、.Net 4.5がインストールされていないことがわかりました。 4.5をインストールすると、コードを変更せずに問題が解決されました。

+1

これは正しいです、そして、これは時間が経つにつれて、この質問への答えになるでしょう。 –

+0

これはWindows XPマシンでこの問題をどのように解決しますか? – TheButlerDidIt

+0

@BitOriented古い、サポートされていない、サーバー以外の環境では実装できないため、新しいバージョンの.Netのバグ修正があなたの回避策を実行するにはあまり好ましくない解決策であると主張していますか? –

関連する問題