2014-06-27 63 views
1

我正在做一個使用linq查詢實體,我想重複使用相同的代碼,但有一個稍微不同的選擇語句。這是查詢:轉換新的對象創建linq表達式爲linq到實體

return from f in GetFields<T>() 
    where f.Id == Id 
    select new Prop<V> 
     { 
      Name = f.Name, 
      Value = toValue(f.value) 
     }; 

其中toValue是一個Func,它創建一個新的Value對象。我想使用幾種toValue函數,它們具有這種類型的身體:

var toValue = f => new DerivedValueClass { 
       FirstField = f.FirstField, 
       SecondField = f.SecondField 
       } 

所以它只是簡單的賦值,它將被sql輕鬆轉換爲實體。然而,當我執行的代碼,LINQ到實體規定:

The LINQ expression node type 'Invoke' is not supported in LINQ to Entities 

我想這是不可能的調用toValue功能,因爲它不能被翻譯。如何從函數toValue創建表達式以便在linq查詢中使用它?

回答

0

後來我發現,Linqkit允許做這樣的事情很容易:

Expression<Func<T, V>> toValue = a => new DerivedObject() { 
    // perform assignment here 
} 

return from f in GetFields<T>().AsExpandable() // <- LinqKit AsExpandable() extension method 
where f.Id == Id 
select new Prop<V> 
    { 
     Name = f.Name, 
     Value = toValue.Invoke(f.value) // <- LinqKit Invoke() extension method 
    }; 

這是非常重要的toValue是一個表達式,因爲編譯器將創建一個ExpressionTree而不是簡單地生成一個lambda表達。 Linqkit使用一些技巧爲了用表達式樹替換toValue調用。有關LinqKit網站的更多信息和here