1

我试图通过使用 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.SqlServer (2.1.1)
  • LinqKit.Microsoft.EntityFrameworkCore (1.1.15)

非常感谢任何帮助。

4

1 回答 1

2

您在示例中缺少的是所有Expression<Func<..>>参数或局部变量的事实。而线

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

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

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

var hasItemsExpr = hasItems();

var query =
    from w in _context.Wallets.AsExpandable()
    where w.WalletItems.Any(hasItemsExpr.Compile())
    select w;
于 2018-07-10T17:06:12.873 回答