2010-10-08 78 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类中的静态方法。

相关问题