【问题标题】:How to create and return an Expression<Func如何创建和返回一个表达式<Func
【发布时间】:2010-10-08 23:12:16
【问题描述】:

我使用实体框架 4.
我希望能够创建一个返回表达式函数的函数,该函数将在 lambda 表达式中使用。

  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;
        }

我该怎么做。

【问题讨论】:

  • 我基于此更新了我的答案。请检查一下。

标签: asp.net-mvc-2 entity-framework-4 lambda


【解决方案1】:

简单。例如,假设您有一个 Product 表,它在您的上下文中映射到 Products EntitySet,现在您想要传递一个谓词并选择一个 Product em>:

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

您可以调用 GetPredicate() 并使用产品 ID 进行过滤:

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

真正的关键在于,您始终可以将 Lambda 表达式传递到需要 Expression 的地方。

编辑:
你应该像这样改变你的代码:

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);
}

【讨论】:

  • 哦,很好,我尝试了您的解决方案,但这给了我这样的错误。 LINQ to Entities 无法识别方法 'System.Linq.Expressions.Expression1[System.Func2[MySite.Models.Supplier,System.Boolean]] GetText()' 方法,并且此方法无法转换为存储表达式。
  • 所以,你的错误是因为 GetText() 方法。请分享您的代码,我会为您修复它,或者让我知道您的确切情况是什么,我会相应地更改我的代码。
  • 我更新了我的帖子。 @Morteza 感谢您的支持
  • 这是一个多语言网站,我想根据客户的语言选择获取文本。现在我对语言 ID 进行了硬编码。
  • 没问题。好的,你不能在 SupplierType 上调用 GetText(),你应该只在需要谓词时传递 GetText()。请看看我编辑的答案,让我知道它是如何为你工作的。
【解决方案2】:

如果您想在运行时动态创建编译后的表达式(而不是在编译时针对特定数据模型硬编码的表达式),您需要使用 Expression 类的静态方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多