PredicateBuilder 不适用于 EF Core
PredicateBuilder is not working on EF Core
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" />
如有任何帮助,我们将不胜感激。非常感谢!
似乎 EF-core 5 与 AsExpandable
的配合不佳。或者相反。它适用于 EF3,但显然 Linqkit 无法适应特定于库的表达式树的特性。
这种情况有解决方法。正如所解释的 ,predicate
不是 Expression
,而是 ExpressionStarter
,它隐式转换为 Expression<Func<T, bool>>
和 Func<T, bool>
。因此,在没有 AsExpandable
:
的情况下,对顶级实体(例如:EF 的 IQueryables
)进行谓词查询
result = ctx.Assets // No '.AsExpandable()'
.Where(predicate) // Implicit conversion of 'predicate' to Expression<Func<Asset,boo>l>
.Select(z => z.Symbol)
.ToArray();
坏消息是,如果不在此区域进行任何修复,您将无法在真正需要时使用 AsExpandable
,例如集合导航属性的谓词。
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" />
如有任何帮助,我们将不胜感激。非常感谢!
似乎 EF-core 5 与 AsExpandable
的配合不佳。或者相反。它适用于 EF3,但显然 Linqkit 无法适应特定于库的表达式树的特性。
这种情况有解决方法。正如所解释的 predicate
不是 Expression
,而是 ExpressionStarter
,它隐式转换为 Expression<Func<T, bool>>
和 Func<T, bool>
。因此,在没有 AsExpandable
:
IQueryables
)进行谓词查询
result = ctx.Assets // No '.AsExpandable()' .Where(predicate) // Implicit conversion of 'predicate' to Expression<Func<Asset,boo>l> .Select(z => z.Symbol) .ToArray();
坏消息是,如果不在此区域进行任何修复,您将无法在真正需要时使用 AsExpandable
,例如集合导航属性的谓词。