使用 NET Core 和 EF Core 构建谓词

Posted

技术标签:

【中文标题】使用 NET Core 和 EF Core 构建谓词【英文标题】:Predicate build with NET Core and EF Core 【发布时间】:2019-01-14 04:03:16 【问题描述】:

非常快速的问题:

我正在尝试创建一个这样的谓词构建器:

    var predicate = PredicateBuilder.False<MyObject>();

但似乎在 Net CoreEF Core 中不可用。

我是不是错过了一个包裹或什么?

【问题讨论】:

【参考方案1】:

您确定您使用的PredicateBuilder 不是自定义类吗? PredicateBuilder 是 LINQKit 的一部分,但 source is also available here 如下:

public static class PredicateBuilder

    public static Expression<Func<T, bool>> True<T>()  return f => true; 

    public static Expression<Func<T, bool>> False<T>()  return f => false; 

    public static Expression<Func<T, bool>> Or<T> (this Expression<Func<T, bool>> expr1,
                                                      Expression<Func<T, bool>> expr2)
    
        var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast<Expression> ());
        return Expression.Lambda<Func<T, bool>>
          (Expression.OrElse (expr1.Body, invokedExpr), expr1.Parameters);
    

    public static Expression<Func<T, bool>> And<T> (this Expression<Func<T, bool>> expr1,
                                                       Expression<Func<T, bool>> expr2)
    
        var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast<Expression> ());
        return Expression.Lambda<Func<T, bool>>
          (Expression.AndAlso (expr1.Body, invokedExpr), expr1.Parameters);
    

【讨论】:

我在 dotnet 核心中没有 Castmethod。您如何使用此代码? 好的,我发现:这是 System.Linq 中存在的扩展方法。【参考方案2】:

这里也有一个解决方案,可以像这样将字符串表达式解析为lambda表达式

Expression<Func<Entity, bool>> predicate 
    = Interpreter.ParsePredicate<Entity>("id = 1 and name='Test'").Result;

参考https://github.com/linhnle/Kkts.Expressions

【讨论】:

嗨,您在这里提出了自己的库,就这个问题而言,这是可以且合适的,但明确提及您是创建者/贡献者总是好的。 Here's 一个很好的例子。

以上是关于使用 NET Core 和 EF Core 构建谓词的主要内容,如果未能解决你的问题,请参考以下文章

6种方法教你更好的使用EF Core构建应用程序

.NET Core 1.0ASP.NET Core 1.0和EF Core 1.0简介

带有 EF Core 更新实体的 ASP.Net 核心 Web Api 如何

(17)ASP.NET Core EF基于数据模型创建数据库

无法从 Linq 查询 EF Core 访问字段值

.Net Core 3 和 EF Core 3 包含问题 (JsonException)