残念ながら、Equals
実装をEFへのクエリで使用することはできません。コードを逆コンパイルして、どのように完了したかを確認できないためです。多くがある場合
bool exists = storeDB.ShippingInformations
.Any(info =>
info.CustomerID == other.CustomerID
&& info.CountryID == other.CountryID
);
(私はアイデアを表示するフィールドを作った、other
は、あなたが探しているShippingInformation
です。)
:あなたは、述語式でAny
メソッドを使用して問題ないはずですあなたはこの式を再利用したい場所は、あなたが式を結合するためにLinqKitを使用する場合があります:
private static Expression<Func<ShippingInformation, ShippingInformation, bool>>
isEqualExpr =
(info, other) =>
info.CustomerID == other.CustomerID
&& info.CountryID == other.CountryID;
// somewhere down this class
var expr = isEqualExpr; // reference the expression locally (required for LinqKit)
bool exists = storeDB.ShippingInformations
.Any(x => expr.Invoke(x, other)); // "injects" equality expression
このようなコードは、データ層に配置する必要があります。
上記のコードが機能するかどうかはわかりません。 EFではクエリ式で「他の」オブジェクトを使用できないことがあります。これが当てはまる場合(私に教えてください)、比較のためにすべてのプリミティブ型の値を受け入れるように式を修正する必要があります(この例ではExpression<Func<ShippingInformation, int, int, bool>>
になります)。
もし私が比較する10のフィールドを持っているなら、1つの式の中にすべてを入れるのではなく、これを行うもっと純粋な方法がありますか? – Seth
これは複数の場所で使用されますか?なぜなら、そうでなければ、1つのクエリだけがきちんとしているからです(私は思う)。静的フィールドとして宣言して[事前にコンパイルする]ことができます(http://msdn.microsoft.com/en-us/library/bb399335.aspx)。これにより、パフォーマンスがさらに向上します。 –
おそらく複数の場所があります。 「静的なフィールドとして宣言する」とはどういう意味ですか?静的メソッドとして比較を行い、それを指すメソッドを宣言することを意味しますか? – Seth