尝试使用使用LinqKit创建的基本表达式时发生异常



我试图通过使用LinqKit强制ef core参数化它认为是常量的值。

当尝试应用github上描述的PredicateBuilder示例时,我遇到了一个异常。这是我的代码:

private async Task getWallets()
{
var query =
from w in _context.Wallets.AsExpandable()
where w.WalletItems.Any(hasItems().Compile())
select w;
var result = await query.ToListAsync();
}
private Expression<Func<WalletItem, bool>> hasItems()
{
var predicate = PredicateBuilder.New<WalletItem>();
var ids = new string[] { "A", "B" };
foreach (var id in ids)
{
predicate = predicate.Or(wi => wi.ExternalId == id);
}
return predicate;            
}

当点击ToListAsync((时,出现以下异常:

System.NotSupportedException:"无法分析表达式"w.WalletItems.Any(__Compile_0(":给定的参数与预期的参数不匹配:类型为"System.Linq.Expressions.TypedParameterExpression"的对象无法转换为类型"System.Linq.Expressions.LambdaExpression"。">

我正在使用以下包在ASP.NET Core 2.1应用程序(netcoreapp2.1(中运行代码:

  • Microsoft.EntityFrameworkCore.Relational(2.1.1(
  • Microsoft.EntityFrameworkCore.SQL服务器(2.1.1(
  • LinqKit.Microsoft.EntityFrameworkCore(1.1.15(

非常感谢您的帮助。

示例中缺少的是,所有Expression<Func<..>>都是参数或局部变量。而线路

where w.WalletItems.Any(hasItems().Compile())

实际上并没有调用hasItems方法,而是在查询表达式树中向其发出MethodCallExpression(即Expression.Call(,这是LINQKitExpand实现无法识别的不同类型的表达式,从而导致EF Core不支持的表达式。

解决方案是将方法调用结果放入一个局部变量中,并在查询表达式树中使用该变量:

var hasItemsExpr = hasItems();
var query =
from w in _context.Wallets.AsExpandable()
where w.WalletItems.Any(hasItemsExpr.Compile())
select w;

最新更新