【问题标题】:LINQPAD - PredicateBuilder throwing errorLINQPAD - PredicateBuilder 抛出错误
【发布时间】:2018-01-31 22:50:14
【问题描述】:

当我在 Linqpad 中运行下面的语句时,它会抛出以下错误:

The LINQ expression node type 'Invoke' is not supported in LINQ to Entities.

这似乎与我在网上看到的其他一些示例相匹配。我做错了什么?

LinqPad 版本 5

语言:C# 语句

连接:包含实体框架的 C# 项目 DLL

var dynamicGlobalFilter = PredicateBuilder.True<users>();
dynamicGlobalFilter = dynamicGlobalFilter.And(x => x.username.Contains("w"));

var test = users.Where(dynamicGlobalFilter);
test.Dump();

注意: 通过在查询窗口中按 F4 并选中该框,我已将 PredicateBuilder 包含在 Linqpad 中。

更新(修复!):

  1. 在 LINQPAD 的查询窗口中按 F4
  2. 在附加参考下按添加
  3. 点击浏览
  4. 找到磁盘上的 LinqKit.dll(从 LinqKit 网站下载)..如果您已经做到了这一点,那么您应该已经将它包含在您的 .NET 解决方案中
  5. 点击确定
  6. 单击“附加命名空间导入”选项卡
  7. 点击从程序集中挑选链接
  8. 选择 LinqKit.dll,然后选择命名空间
  9. 单击添加选定的命名空间
  10. 点击确定

【问题讨论】:

    标签: c# asp.net entity-framework linq linqpad


    【解决方案1】:

    我建议您最好从 NuGet 添加最新的 LINQKit。

    F4,单击Add NuGet... 按钮,搜索LINQKit 并选择LINQKit 或LINQKit.Core 并单击Add To Query 按钮,在Add Namespaces 对话框中选择LINQKit 并单击Add selected namespaces in future without asking 按钮,然后点击OK按钮,再点击Close按钮,再点击OK按钮。

    这将为您提供最新的 LINQKit 增强功能,包括自动处理 Ands 和 Ors 的 New 运算符:

    var dynamicGlobalFilter = PredicateBuilder.New<users>();
    dynamicGlobalFilter = dynamicGlobalFilter.And(x => x.username.Contains("w"));
    
    var test = users.Where(dynamicGlobalFilter);
    test.Dump();
    

    注意:如果您想使用旧版本,您可以按F4 并单击右下方的Include PredicateBuilder 复选框,然后单击OK 按钮。

    【讨论】:

      【解决方案2】:

      请添加 .AsExpandable()

      var dynamicGlobalFilter = PredicateBuilder.True<users>();
      dynamicGlobalFilter = dynamicGlobalFilter.And(x => x.username.Contains("w"))
      var test = users.AsExpandable().Where(dynamicGlobalFilter);
      test.Dump();
      

      要了解更多信息,请参阅参考资料 Albahari.com Predicate builder

      “实体框架的查询处理管道无法处理调用表达式,这就是为什么您需要在查询中的第一个对象上调用 AsExpandable。通过调用 AsExpandable,您可以激活 LINQKit 的表达式访问者类,该类将调用表达式替换为实体框架更简单的构造可以理解。”

      【讨论】:

      • AsExpandable() 仅在您要在查询中放入用户定义的函数时才需要。
      • 我在 LinqPad 中复制了代码以及错误。通过添加 .AsExpandable() 为条件返回了正确的结果
      • 在查询中添加对 PredicateBuilder 的引用后,我在 SQL 数据库上运行不带 AsExpandable 的代码没有问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 2012-10-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多