不幸的是,您不能在EF的查詢中使用您的Equals
實現,因爲它無法反編譯代碼以查看它是如何完成的。你應該使用Any
方法與謂詞表達式是罰款:
bool exists = storeDB.ShippingInformations
.Any(info =>
info.CustomerID == other.CustomerID
&& info.CountryID == other.CountryID
);
(我做了場最多隻是爲了顯示這個想法,other
就是你要找的ShippingInformation
。)
如果有很多要重新使用該表達的地方,你可能需要使用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
這樣的代碼應放置在數據層。
我不是100%確定上述代碼是否工作。 EF很可能不允許在查詢表達式中使用「其他」對象。如果是這種情況(請讓我知道),您必須修改表達式以接受所有基元類型值進行比較(在我們的示例中,它將變爲Expression<Func<ShippingInformation, int, int, bool>>
)。
如果我有十個領域進行比較,是否有一個更好的方法來做到這一點,而不是把它放在一個表達式? – Seth
這會在多個地方使用嗎?因爲如果它不會,只有一個查詢是相當整潔的(我認爲)。您可以將其聲明爲靜態字段並[提前編譯](http://msdn.microsoft.com/en-us/library/bb399335.aspx),以便更高性能。 –
很可能不止一個地方。你是什麼意思「將它聲明爲靜態字段」?你的意思是聲明一個方法來進行比較作爲一種靜態方法並指出這一點? – Seth