我试图通过使用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;