如何创建并返回 Expression
发布于 2024-09-26 21:40:54 字数 696 浏览 2 评论 0 原文

我使用实体框架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;
        }

我如何执行此操作。

I Use entity Framework 4.
I would like to be able to create a function that return an Expression func that will be use in a lambda expression.

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

I would like to make this call like that

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

My Partial class is:

  public partial class SupplierType
    {

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

How can i perform this.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

蓝咒 2024-10-03 21:40:54

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

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

您可以使用产品 ID 调用 GetPredicate() 来基于此进行过滤:

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

真正的要点是,您始终可以将 Lambda 表达式传递到表达式 所需要的位置。是需要的。

编辑:

您应该像这样更改您的代码:

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

Easy. For example, Let's assume you have a Product table that is mapped to Products EntitySet in your context, now you want to pass a predicate and select a Product:

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

You can call GetPredicate() with a Product ID to filter based on that:

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

The point really is that you can always pass a Lambda Expression to where an Expression<T> is needed.

EDIT:

You should change your code like this:

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);
}
維他命╮ 2024-10-03 21:40:54

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

If you want to dynamically create compiled Expression at runtime (as opposed to ones hardcoded against a particular data model at compile time) you need to use the static methods on the Expression class.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文