我怎樣才能做到在LINQ to實體下面的實體框架::表達 - 無法識別的方法
public static Expression<Func<T, bool>> IsOk<T>(long? entityId)
{
return x => (!entityId.HasValue || entityId.Value == x.GetEntityId());
}
的x.GetEntityId()
返回一個例外,因爲它不識別方法。
我怎樣才能做到在LINQ to實體下面的實體框架::表達 - 無法識別的方法
public static Expression<Func<T, bool>> IsOk<T>(long? entityId)
{
return x => (!entityId.HasValue || entityId.Value == x.GetEntityId());
}
的x.GetEntityId()
返回一個例外,因爲它不識別方法。
你不能 - 你的數據庫不能運行GetEntityId()
(因爲它不理解它),因此你的Linq提供者不能翻譯它。
所以你怎麼能解決這個問題:
GetEntityId()
中有邏輯),則需要在客戶端完成:返回所有行並隨後在C#中執行過濾。當然,不用說它會對你的表現做什麼。我會建議你的類型參數被限制像IMyExpectation
一個自定義的界面包含
interface IMyExpectation {
int GetEntityId();
}
然後限制你的方法的類型參數到該接口。然後,(現在這將盡可能的GetEntityId
方法去編譯。)
public static Expression<Func<T, bool>> IsOk<T>(long? entityId)
where T: IMyExpectation // << restrict the type to what is needed
{
return new Func<T, bool>(
x => !entityId.HasValue || entityId.Value == x.GetEntityId()
);
}
在實體框架類實現該接口在你需要它,但在一個單獨的文件中,這樣的模型類的partial
一部分不會在模型重新生成時刪除自定義代碼。例如
在你的EF模型實體
注:這是受Aliostad's answer。
public partial class Customer : IMyExpectation { //...
public partial class Invoice : IMyExpectation { //....
// etc
或者,您波蘇斯
注:這應該正常工作,如果支配由EF類
public class CustomerPoco: IMyExpectation { //...
public class InvoicePoco : IMyExpectation { //...
現在你的實體類(和任何你實現 'IMyExpectation'上)都表達自己就像你原來的方法想要的一樣。
最後,你的方法將理解你已經實現了接口的任何這些東西,因此它們都是通過類型參數傳遞給方法的候選對象。
如果你的這個答案是正確的,那麼這應該很好地包裝好。
@John K:它不會幫助,因爲db不知道什麼是GetEntityId()。 – Naor 2011-05-05 00:05:29
我還添加了一個T ...我正在寫上。你的邏輯能夠訪問具有GetEntityId()方法的'ClassName'類嗎? – 2011-05-05 00:07:19
最後我拍了一張照片,並提出了一個界面。因爲我不確定我爲你的需求走了正確的方向,如果這個答案是離開基地,我會刪除它作爲噪音。 – 2011-05-05 00:23:52
不是一個答案,但是從什麼時候'IsOK'將它作爲方法名稱剪下來了! – 2011-05-04 23:59:41
@米奇小麥:這只是一個例子。 – Naor 2011-05-05 00:04:29
@Naor;你有沒有考慮過你可能試圖讓事情變得複雜的可能性?只是一個念頭...... – 2011-05-05 00:06:57