2011-05-04 103 views
0

我怎樣才能做到在LINQ to實體下面的實體框架::表達 - 無法識別的方法

public static Expression<Func<T, bool>> IsOk<T>(long? entityId) 
{ 
    return x => (!entityId.HasValue || entityId.Value == x.GetEntityId()); 
} 

x.GetEntityId()返回一個例外,因爲它不識別方法。

+0

不是一個答案,但是從什麼時候'IsOK'將它作爲方法名稱剪下來了! – 2011-05-04 23:59:41

+1

@米奇小麥:這只是一個例子。 – Naor 2011-05-05 00:04:29

+0

@Naor;你有沒有考慮過你可能試圖讓事情變得複雜的可能性?只是一個念頭...... – 2011-05-05 00:06:57

回答

0

你不能 - 你的數據庫不能運行GetEntityId()(因爲它不理解它),因此你的Linq提供者不能翻譯它。


UPDATE

所以你怎麼能解決這個問題:

  • ID必須是對因此映射到數據庫中的列的實體的屬性。這種方式可以很容易地在表達式中使用
  • 如果計算Id(GetEntityId()中有邏輯),則需要在客戶端完成:返回所有行並隨後在C#中執行過濾。當然,不用說它會對你的表現做什麼。
+0

那麼我該如何解決呢?我有什麼選擇?這是否與ExpressionTree有關? – Naor 2011-05-05 00:06:16

+0

請參閱我的更新。 – Aliostad 2011-05-05 00:09:46

+0

我將屬性映射到數據庫。 – Naor 2011-05-06 01:23:07

1

我會建議你的類型參數被限制像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'上)都表達自己就像你原來的方法想要的一樣。
最後,你的方法將理解你已經實現了接口的任何這些東西,因此它們都是通過類型參數傳遞給方法的候選對象。

如果你的這個答案是正確的,那麼這應該很好地包裝好。

+0

@John K:它不會幫助,因爲db不知道什麼是GetEntityId()。 – Naor 2011-05-05 00:05:29

+0

我還添加了一個T ...我正在寫上。你的邏輯能夠訪問具有GetEntityId()方法的'ClassName'類嗎? – 2011-05-05 00:07:19

+0

最後我拍了一張照片,並提出了一個界面。因爲我不確定我爲你的需求走了正確的方向,如果這個答案是離開基地,我會刪除它作爲噪音。 – 2011-05-05 00:23:52

相關問題