构建“平面”而不是“树”LINQ 表达式

2024-04-26

我正在使用一些代码(可用here https://web.archive.org/web/20160221084142/http://blogs.msdn.com:80/b/alexj/archive/2009/03/26/tip-8-writing-where-in-style-queries-using-linq-to-entities.aspxMSDN 上)动态构建包含多个 OR“子句”的 LINQ 表达式。

相关代码是

var equals = values.Select(value => (Expression)Expression.Equal(valueSelector.Body, Expression.Constant(value, typeof(TValue))));

var body = equals.Aggregate<Expression>((accumulate, equal) => Expression.Or(accumulate, equal));

这会生成一个如下所示的 LINQ 表达式:

(((((ID = 5) OR (ID = 4)) OR (ID = 3)) OR (ID = 2)) OR (ID = 1))

使用此表达式时,我遇到了递归限制 (100),因此我想生成一个如下所示的表达式:

(ID = 5) OR (ID = 4) OR (ID = 3) OR (ID = 2) OR (ID = 1)

我如何修改表达式构建代码来做到这一点?


您需要修改生成,以便它构建平衡树而不是序列ORs,其中左子树是单个表达式,右子树包含所有剩余元素。以图形方式:

 Your code               Better
 ---------              --------
    OR                     OR
 #1    OR              OR      OR
     #2  OR          #1  #2  #3  #4
       #3  #4

正如您所看到的,即使在这种简单的情况下,更好的方法也不是那么深(递归嵌套)。生成更好的表达式树的代码可以用 C# 编写为递归方法:

Expression GenerateTree(List<Expression> exprs, int start, int end) {
  // End of the recursive processing - return single element
  if (start == end) return exprs[start];

  // Split the list between two parts of (roughly the same size)
  var mid = start + (end - start)/2;
  // Process the two parts recursively and join them using OR
  var left = GenerateTree(exprs, start, mid);
  var right = GenerateTree(exprs, mid+1, end);
  return Expression.Or(left, right);
}

// Then call it like this:
var equalsList = equals.ToList();
var body = GenerateTree(equalsList, 0, equalsList.Length);

我没有尝试代码,所以可能会有一些小错误,但它应该显示出这个想法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

构建“平面”而不是“树”LINQ 表达式 的相关文章

  • 检测 Windows 重新启动是否是由于 Windows 更新造成的

    我的电脑上的一些应用程序一直在检测 Windows 更新是否重新启动 这是可以观察到的 因为它们会在 Windows 更新自动重启后重新启动 这非常有帮助 因为这些应用程序会重新加载更改 甚至unsaved更改或恢复选项卡 如果是浏览器 执
  • 来自其他位置的 .NET 参考 dll

    我正在根据第三方程序中包含的一些 DLL 制作一个程序 我不被允许自己分发这些 DLL 必须安装第三方程序才能使我的程序运行 我怎样才能引用这些DLL 我通过程序设置的注册表项知道它们的确切位置 我尝试在 Project gt Refere
  • 确定 .NET 类型的序列化大小和非托管内存效率

    我的问题是是否可以确定引用类型的序列化大小 以字节为单位 情况如下 我使用 BinaryFormatter 类来序列化基本 NET 类型 例如 Serializable public class Foo public string Foo1
  • 在方法中使用 IncludeMultiple

    我正在使用 Ladislav Mrnka 的扩展方法 public static IQueryable
  • 使用 Bloomberg .Net API 的每小时数据

    我正在努力解决使用 Net API 3 0 从 Bloomberg 获取每小时开盘价 最高价 最低价和最后价格快照的逻辑 我已经用谷歌搜索了很多次 但没有运气 对此的任何帮助将不胜感激 我试图在 Bloomberg Net API C 中找
  • 为什么 HttpClient 使套接字保持打开状态?

    在创建 使用和处置多个 HttpClient 时 我注意到有套接字处于 TIME WAIT 状态 例如 运行以下命令后 using System Net Http namespace HttpClientTest public class
  • 如何通过 HttpContext 访问 Blazor Server .Net 6 中的 cookie?

    不幸的是 有关在 Blazor Server 中访问 c ookie 的教程和之前的 StackOverflow 答案似乎在新的 Net 版本中变得无效 例如 我无法获得以下任一答案 根据 net 6 中没有的评论来判断 如何在服务器端 B
  • Winform 没有.NET 框架?

    我必须创建一些表单并将其作为直接 EXE 提供 而不是安装程序 它安装 NET 框架 最终用户对此不满意 他们想要可以直接打开和工作的东西 我知道它可以作为网络完成 但我正在寻找 winforms 吗 请建议哪种工具 技术可以处理这个问题
  • WCF - 进行多次调用时随机客户端超时

    我有一个WPF客户端通过以下方式请求数据WCF服务托管于IIS 7 服务方法调用存储过程 SQL 2012 using EF检索一些数据 由于需要加载大量数据 因此客户端会多次调用服务方法 以 分解 数据加载并避免大量负载和超时 我们使用生
  • Lego Mindstorm NXT 的 C# 库 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 是否有适用于 Lego Mindstorm NXT 的最新 C NET 库 NXT NET 乐高头脑风暴 最后更新时间 2008 年 4
  • 如何使用 C# 从 Kafka 获取主题列表

    我想从卡夫卡获取主题列表 我正在使用 kafka net 客户端 但无法在有关获取主题列表的文档中找到 您可以使用 Confluence Kafka 包中提供的 AdminClient 列出所有主题 using Confluent Kafk
  • 无法从 ComboBox 获取值

    我有一个简单的组合框 其中包含一些值 文本项 我使用 ComboBox DisplayMember 和 ComboBox ValueMember 来正确设置值 文本 当我尝试获取该值时 它返回一个空字符串 这是我的代码 表单加载事件 cbP
  • 什么是适合 .net 的优秀 RDF 库? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个可以处理 RDF 和 OWL 数据的库 到目前为止我已经发现 semweb http razor occams info c
  • Linux下的C#,Process.Start()异常“没有这样的文件或目录”

    我在使用 Process 类调用程序来启动程序时遇到问题 可执行文件的层次结构位于 bin 目录下 而当前工作目录需要位于 lib 目录下 project bin a out this is what I need to call lib
  • 如何将 RTF 文件转换为 pdf 文件?

    如何将 RTF 文件转换为 PDF 文件 我有 adobe PDF 打印机 我应该使用它吗 如果是这样 我如何以编程方式访问它 您可以使用 PDF 打印机 但仍有一些问题需要解决 为了处理跨多个页面的文本 您需要本文 http msdn m
  • Request.Url.Query 和 Request.QueryString 有什么区别?

    我一直在追踪 URL 重写应用程序上的错误 该错误表现为查询字符串中某些变音符号的编码问题 基本上 问题是基本上 search aspx search he m nek 的请求被 search he c5 99m c3 a1nek 的查询字
  • 如何在 Visual Studio 2015 中为多个解决方案和项目设置单个 Nuget 包文件夹

    我们正在 Visual Studio 2015 中开发多个解决方案 这些解决方案共享一些需要 nuget 包的核心项目 当从一个解决方案添加 nuget 包并随后由另一解决方案打开时 无法解析 nuget 引用 文件夹结构如下 Codeba
  • WCF 每个端点有不同的身份验证方法

    我有 WCF 服务 我的服务有 2 个端点 每个端点都有不同的联系人 该服务使用自定义用户名身份验证 在 的 customUserNamePasswordValidatorType 属性中定义 问题是两个端点将使用相同的身份验证方法 无论如
  • 单击按钮本地化应用程序

    我在我的项目 mainMaster 页面中找到了 imageButtons
  • 无法将方法组分配给 asp.net、linq、c# 中的隐式类型局部变量

    public void selectqueryasso CustomerOrderResult cso new CustomerOrderResult var a from as1 in ds orders from as2 in ds o

随机推荐