使用 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 Core 和 EF 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 核心中没有Cast
method。您如何使用此代码?
好的,我发现:这是 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 构建谓词的主要内容,如果未能解决你的问题,请参考以下文章
.NET Core 1.0ASP.NET Core 1.0和EF Core 1.0简介
带有 EF Core 更新实体的 ASP.Net 核心 Web Api 如何