2017-08-07 15 views
3

我有一些代碼基於切換傳遞給它的枚舉值,然後執行數據庫查詢(通過EF)的switch語句如何更換表情

switch(regtype) 
{ 
    case RegType.Type1: 
     return (Dc.ListPeople(n => n.RegistrationType1Id != null) 
     .DefaultIfEmpty() 
     .Max(n => n.RegistrationType1Id) ?? 0) + 1; 
    case RegType.Type2: 
     return (Dc.ListPeople(n => n.RegistrationType2Id != null) 
     .DefaultIfEmpty() 
     .Max(n => n.RegistrationType2Id) ?? 0) + 1; 
... 
} 

現在的數據模型是它是什麼,讓我們看看過去。 RegistrationType_N_Idint?,ListPeople需要參數Expression<Func<Person, bool>>

總共有3個枚舉值,所以它不是不好,但即使只是爲了心理練習,我想知道我是否可以用更花哨的東西來替換這個switch語句。

我想到了Dictionary<RegType, Expression<Func<something>>>,但是由於db謂詞中的第一次使用不同於Max()中的第二次使我陷入了困境。

回答

3

您可以創建一個單獨的方法,將屬性選擇器作爲參數。實體框架不能直接處理委託,因爲它必須將你的代碼翻譯成SQL,所以有必要處理表達式樹。

public int M(Expression<Func<Person, int?>> selector) 
{ 
    var expr = Expression.NotEqual(selector.Body, Expression.Constant(null, typeof(object))); 
    var lambda = Expression.Lambda<Func<Person, bool>>(expr, selector.Parameters); 

    return (Dc.ListPeople(lambda) 
    .DefaultIfEmpty() 
    .Max(selector)) ?? 0) + 1; 
} 

用法:

switch(regtype) 
{ 
    case RegType.Type1: 
     return M(x => x.RegistrationType1Id); 
+0

這將引發 「:本LINQ表達式節點類型 '調用' 不LINQ支撐到實體NotSupportedException異常」。據我所知,EF需要一個'Expression '來創建適當的SQL查詢。 – romeozor

+0

@romeozor我錯過了EF部分。我在方法聲明中將'Func'改爲'Expression '。 – Kapol

+0

但現在代碼試圖調用一個表達式,這將不會編譯 – romeozor