【问题标题】:PredicateBuilder is not working on EF CorePredicateBuilder 不适用于 EF Core
【发布时间】:2020-06-25 15:06:02
【问题描述】:
public string[] FindAssets2()
{
    string[] result;

    using (var ctx = new StockContext())
    {
        var predicate = PredicateBuilder.New<Asset>().Or(asset => asset.Symbol.Contains("TSLA"));

        result = ctx.Assets.AsExpandable()
        .Where(predicate)
        .Select(z => z.Symbol)
        .ToArray();
    }

    return result;
}

只是一段简单的代码。它把我扔了

Exception: Unhandled expression type: 'Extension'
LinqKit.ExpressionVisitor.Visit(Expression exp)
LinqKit.ExpressionVisitor.VisitExpressionList(ReadOnlyCollection<Expression> original)
LinqKit.ExpressionVisitor.VisitMethodCall(MethodCallExpression m)
LinqKit.ExpressionVisitor.Visit(Expression exp)
LinqKit.Extensions.Expand(Expression expr)
LinqKit.ExpandableQueryProvider<T>.System.Linq.IQueryProvider.CreateQuery<TElement>(Expression expression)
System.Linq.Queryable.Where<TSource>(IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate)

下面是我安装的包

    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="5.0.0-preview.4.20220.10" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="5.0.0-preview.4.20220.10" />
    <PackageReference Include="LINQKit.Core" Version="1.1.17" />

任何帮助将不胜感激。非常感谢!

【问题讨论】:

  • 当您在 Visual Studio 中将鼠标悬停在 predicate 上时,它表示它是什么类型?
  • 如果你只是 ToString() 它 - 它是什么样的?
  • 尽管如此,最终它看起来是这样的:可能是要向编写 LinqKit 的人报告的东西
  • 对于所有迟到的访问者和想要将 EFC 与 LINQKIT 一起使用的人,请考虑在 https://www.nuget.org/packages/Microsoft.EntityFrameworkCore/5.0.0-preview.2.20120.8 上使用 EFC 5.0.0-preview.2.20120.8。这是目前唯一适用于 LINQKIT 的版本。

标签: c# .net-core entity-framework-core predicatebuilder


【解决方案1】:

似乎 EF-core 5 与 AsExpandable 不兼容。或者说反过来。它适用于 EF3,但显然 Linqkit 无法适应特定于库的表达式树特性。

对于这种情况有一个解决方法。正如所解释的here,predicate 不是Expression,而是ExpressionStarter,它隐式转换为Expression&lt;Func&lt;T, bool&gt;&gt; 和Func&lt;T, bool&gt;。因此,在顶级实体上使用谓词的查询(例如:EF 的 IQueryables)在没有 AsExpandable 的情况下也可以工作:

结果 = ctx.Assets // 没有 '.AsExpandable()' .Where(predicate) // 'predicate' 到 Expressionl> 的隐式转换 .Select(z => z.Symbol) .ToArray();

坏消息是,如果在这方面没有任何修复,您将无法在真正需要时使用AsExpandable,例如集合导航属性的谓词。

【讨论】:

  • Gertt,异常调用堆栈仅包含 LinqKit 方法,所以不是相反 - LinqKit 不能很好地与 EFC(以及任何其他发出自定义代码(又名“扩展” ) 表达式) 在查询表达式树中?
  • @Ivan 是 Linqkit 和 EF5 的结合。相同的 Linqkit 版本适用于 EF3。我不知道该怪谁。当然,从某种意义上说,它就是 Linqkit。 EF5 工作(有点),将 Linqkit 添加到它并中断。
  • 显然 EFC5 使用自定义表达式。表达式访问者应跳过此类表达式。 LinqKit 已经过时了,问题就在那里,应该(如果)在那里解决,而不是在 EFC 中。
  • @Ivan 我同意。取悦 Linqkit 不是世界的责任。
猜你喜欢
  • 2018-03-24
  • 1970-01-01
  • 2019-05-04
  • 1970-01-01
  • 1970-01-01
  • 2021-04-19
  • 1970-01-01
  • 2021-01-11
  • 1970-01-01
相关资源
最近更新 更多