2010-10-08 75 views
1

I使用實體框架4.
我希望能夠創建一個函數,該函數返回將在lambda表達式中使用的表達式func。

如何創建並返回一個表達式<Func

var ViewModel = _db.Suppliers.Select(model => new { 
       model,SupType = model.SupplierType.SupplierTypeTexts.Where(st => st.LangID == 1) 
      }); 

我想撥打這個電話一樣,

var ViewModel = _db.Suppliers.Select(model => new { 
       model,SupType = model.SupplierType.GetText() 
      }); 

我的部分類:

public partial class SupplierType 
    { 

     public Expression<Func<SupplierTypeText, bool>> GetText() 
     { 
      return p => p.LangID == 1; 
     } 

我如何執行此。

+0

我根據這個更新了我的答案。請檢查一下。 – 2010-10-09 00:36:37

回答

4

簡單。例如,假設你有一個映射到產品的EntitySet在上下文中的產品表,現在你想傳遞一個謂詞和選擇產品

Expression<Func<Product, bool>> GetPredicate(int id) { 
    return (p => p.ProductID == id); 
} 

您可以致電GetPredicate ()與產品ID過濾器的基礎上:

var query = ctx.Products.Where(GetPredicate(1)).First(); 

點真的是,你總是可以傳遞一個Lambda表達式到表達式< T>是必要的。

編輯:
你應該改變這樣的代碼:

var ViewModel = _db.Suppliers.Select(model => new { 
    model, 
    SupType = model.SupplierType.SupplierTypeTexts.Where(GetText()) 
}); 
public Expression<Func<SupplierTypeText, bool>> GetText() { 
    return (stt => stt.LangID == 1); 
} 
+0

噢,不錯,我嘗試了你的解決方案,但那給了我一個這樣的錯誤。 LINQ to Entities不識別方法'System.Linq.Expressions.Expression'1 [System.Func'2 [MySite.Models.Supplier,System.Boolean]] GetText()'方法,並且此方法不能被轉換爲商店表達。 – 2010-10-09 00:01:52

+0

所以,你的錯誤是由於GetText()方法。請分享您的代碼,我會爲您解決它或讓我知道您的確切場景,我會相應地更改我的代碼。 – 2010-10-09 00:12:13

+0

我對我的帖子進行了更新。 @Morteza感謝您的支持 – 2010-10-09 00:18:19

0

如果你想在運行時動態創建編譯的表達式(而不是那些硬編碼針對特定數據模型在編譯時),您需要使用Expression類中的靜態方法。

相關問題