2017-05-15 7 views
1

エンティティへのLinqでは、標準のC#メソッドを使用して "select"節の結果を変更することはできません。標準関数が必要です。選択内のエンティティカスタム関数へのLinq

私は、このようなクエリを起動する必要があります。

CoreEntities.Contracts.Select(
c=> new { 
    c.Name, 
    c.Type, 
    Role = MapToRole(c)); 

private string MapToRole(Contract contract) { 
    switch(contract.Type) { 
     case: CTypes.Main: return "somerole1";break; 
     case: CTypes.Secondary: return "somerole2";break; 
     // ... 
     default: break; 
    } 

    return "none"; 
} 

"MapToRoleは" ちょうどLINQクエリをdeclutterするために作成したC#の方法です。

Entity Framework "linq to Entity"パーサーが受け入れるカスタムC#関数を作成する方法はありますか?

私はクエリフィルタのためのソリューションを見つけましたが、データフォーマットはありませんでした。

+0

MapToRoleメソッドを質問に追加できますか? – Oliver

+0

MapToRoleには、単純なif/else/switch文があります。 –

+0

MapToRoleをlamba式に変換できる場合(条件付き演算子などを使用)、LINQKitを使用してラムダをクエリにマップできます。 – NetMage

答えて

2

単純な変換であるため、プロバイダが翻訳する必要はありません。 Select()の前にAsEnumerable()を追加するだけで、プロジェクタからプロジェクションを「切り離す」ことをお勧めします。

また、CTypesプロパティをデータ型とモデル内で変換を実行するメソッド/プロパティに含めることもできます。サイドノートとして


、アプリケーション層において、この特定の変換を行うと、あなただけの列挙値ではなく、文字列を通じて引っ張っていることを意味 - プロバイダからのため、以下のデータ。

+0

CTypesプロパティをモデルに追加すると、Linq toエンティティ例外が発生します。さらに、プロパティはAutoMapperを使用して別のモデルにマップされています。 –