用于多级查询的动态 Linq 表达式

2023-12-31

我想动态构建以下 Linq 表达式。

我遇到的问题是我无法构建表达式树来容纳复杂的 Select/Any 语句。我读过,为了使用方法,您实际上必须调用该方法,如下所示:

 Invoke("Any")

我需要动态构建的表达式:

Expression<Func<TXLifeRequest, bool>> filter = (txreq) => 
txreq.IsDeleted == false &&
txreq.OLifE.Holding.Select(h => h.Policy)
    .Any(p => p.RequirementInfo
        .Any(r => r.ReqStatus.tc == OLI_LU_REQSTAT.OLI_REQSTAT_OUTSTANDING.tc));

var results = db.GetQueryable(filter)
                .Include(r => r.OLifE.Holding.Select(h => h.Policy)
                   .Select(p => p.RequirementInfo)).ToList();

这是我的模型类:

OLI_LU_REQSTAT

public partial class OLI_LU_REQSTAT : BaseType {

    public string tc { get; set; }

    public string Value { get; set; }
}

TXLife请求

public partial class TXLifeRequest : BaseEntity
{
    public virtual OLifE OLifE { get; set; }

    ...
}

OLifE

public partial class OLifE : BaseEntity
{
    public virtual List<Holding> Holding { get; set; }
        ...
}

Holding

public class Holding : BaseEntity
{
    public virtual Policy Policy { get; set; }
    ...
}

Policy

public class Policy : BaseEntity
{
    public virtual List<RequirementInfo> RequirementInfo { get; set; }

    ...
}

需求信息

public partial class RequirementInfo : BaseEntity
{
     public virtual OLI_LU_REQSTAT ReqStatus { get; set; }

    ...
}   

目前,我正在针对 GetProperty 运行 foreach 反射,但无法理解文档以便在对象模型中降低 3-4 级:

ParameterExpression parameter = Expression.Parameter(typeof(T), "i");
MemberExpression property = Expression.Property(parameter, propertyName);
ConstantExpression constant = Expression.Constant(val, propertyType);


var condition =
    Expression.Lambda<Func<T, bool>>(
        Expression.Equal(
            property,
            constant
        ),
        parameter
    );

result = AppendExpression(result, condition, result);

更新1。)添加了需求信息。添加所有类属性是没有意义的,因为所需的类结构已经存在。


相当长。我觉得它太复杂了,“可维护”,如果你需要做一些改变,那就变得相当困难。即使使其“动态”以便可以控制(启用或禁用部件)也是很困难的。

Given

// Enumerable.Any()
static readonly MethodInfo anyTSource = (from x in typeof(Enumerable).GetMethods(BindingFlags.Static | BindingFlags.Public)
                                         where x.Name == nameof(Enumerable.Any)
                                         let args = x.GetGenericArguments()
                                         where args.Length == 1
                                         let pars = x.GetParameters()
                                         where pars.Length == 2 &&
                                             pars[0].ParameterType == typeof(IEnumerable<>).MakeGenericType(args[0]) &&
                                             pars[1].ParameterType == typeof(Func<,>).MakeGenericType(args[0], typeof(bool))
                                         select x).Single();

// Enumerable.Select()
public static readonly MethodInfo selectTSourceTResult = (from x in typeof(Enumerable).GetMethods(BindingFlags.Static | BindingFlags.Public)
                                                          where x.Name == nameof(Enumerable.Select)
                                                          let args = x.GetGenericArguments()
                                                          where args.Length == 2
                                                          let pars = x.GetParameters()
                                                          where pars.Length == 2 &&
                                                                    pars[0].ParameterType == typeof(IEnumerable<>).MakeGenericType(args[0]) &&
                                                                    pars[1].ParameterType == typeof(Func<,>).MakeGenericType(args[0], args[1])
                                                          select x).Single();

这就是 LINQEnumerable.Any() and Enumerable.Select()

并给出你的

// txreq => ((txreq.IsDeleted == False) AndAlso txreq.OLifE.Holding.Select(h => h.Policy).Any(p => p.RequirementInfo.Any(r => (r.ReqStatus.tc == OLI_LU_REQSTAT.OLI_REQSTAT_OUTSTANDING.tc))))
string str1 = filter.ToString();

将您的表达式与生成的表达式进行比较

使用一些快捷方式(而不是txreq.IsDeleted == False I use !rxreq.IsDeleted而不是包括OLI_LU_REQSTAT.OLI_REQSTAT_OUTSTANDING.tc我在构建表达式树时读取它的值并将其放入Expression.Constant(),

var par = Expression.Parameter(typeof(TXLifeRequest), "txreq");

// txreq.IsDeleted == false (simplified to !txreq.IsDeleted)
var notIsDeleted = Expression.Not(Expression.Property(par, "IsDeleted"));

// r => 
var par4 = Expression.Parameter(typeof(RequirementInfo), "r");

// OLI_LU_REQSTAT.OLI_REQSTAT_OUTSTANDING.tc
var oli_reqstat_outstanding_tc = Expression.Constant(OLI_LU_REQSTAT.OLI_REQSTAT_OUTSTANDING.tc);

// r.ReqStatus.tc == OLI_LU_REQSTAT.OLI_REQSTAT_OUTSTANDING.tc
Expression<Func<RequirementInfo, bool>> any2Lambda = Expression.Lambda<Func<RequirementInfo, bool>>(Expression.Equal(Expression.Property(Expression.Property(par4, "ReqStatus"), "tc"), oli_reqstat_outstanding_tc), par4);

// To check if it is correct
//any2Lambda.Compile();

// p => 
var par3 = Expression.Parameter(typeof(Policy), "p");

// p.RequirementInfo.Any(...)
Expression<Func<Policy, bool>> any1Lambda = Expression.Lambda<Func<Policy, bool>>(Expression.Call(anyTSource.MakeGenericMethod(typeof(RequirementInfo)), Expression.Property(par3, "RequirementInfo"), any2Lambda), par3);

// To check if it is correct
//any1Lambda.Compile();

// h => 
var par2 = Expression.Parameter(typeof(Holding), "h");

// h.Policy
Expression<Func<Holding, Policy>> selectLambda = Expression.Lambda<Func<Holding, Policy>>(Expression.Property(par2, "Policy"), par2);

// To check if it is correct
//selectLambda.Compile();

//txreq.OLifE.Holding
var holding = Expression.Property(Expression.Property(par, "OLifE"), "Holding");

// txreq.OLifE.Holding.Select(...)
var select = Expression.Call(selectTSourceTResult.MakeGenericMethod(typeof(Holding), typeof(Policy)), holding, selectLambda);
var any1 = Expression.Call(anyTSource.MakeGenericMethod(typeof(Policy)), select, any1Lambda);

var and = Expression.AndAlso(notIsDeleted, any1);

Expression<Func<TXLifeRequest, bool>> lambda = Expression.Lambda<Func<TXLifeRequest, bool>>(and, par);

// To check if it is correct and/or use it
//var compiled = lambda.Compile();

如果我们尝试lambda.ToString() we get:

txreq => (Not(txreq.IsDeleted) AndAlso txreq.OLifE.Holding.Select(h => h.Policy).Any(p => p.RequirementInfo.Any(r => (r.ReqStatus.tc == "SOMEVALUE"))))

这足够相似了。

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

用于多级查询的动态 Linq 表达式 的相关文章

  • VLC 媒体播放器有 C# 界面吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否可以使用 C 控制台应用程序中的包装器从 VLC 播放中当前播放的文件中读取曲目统计信息 时间 标
  • C# SmtpClient编程中如何设置带有中文的附件文件名?

    我的代码如下 ContentType ct new ContentType ct MediaType MediaTypeNames Application Octet ct Name 这是一个很长的中文文件名希望能用它在附件名中 Doc A
  • 捕获 .aspx 和 .ascx 页面中的异常

    问题说明了一切 请看以下示例代码 ul li li ul
  • EntityHydrate 任务失败

    我最近安装了 Visual Studio 11 Beta 和 Visual Studio 2010 之后 我无法在 Visual Studio 2010 中构建依赖于 PostSharp 的项目 因此我卸载了 Visual Studio 1
  • 在 C 语言中,为什么数组的地址等于它的值?

    在下面的代码中 指针值和指针地址与预期不同 但数组值和地址则不然 怎么会这样 Output my array 0022FF00 my array 0022FF00 pointer to array 0022FF00 pointer to a
  • Boost ASIO 串行写入十六进制值

    我正在使用 ubuntu 通过串行端口与设备进行通信 所有消息都必须是十六进制值 我已经在 Windows 环境中使用白蚁测试了通信设置 并得到了我期望的响应 但在使用 Boost asio 时我无法得到任何响应 以下是我设置串口的方法 b
  • 2个对象,完全相同(除了命名空间)c#

    我正在使用第三方的一组网络服务 但遇到了一个小障碍 在我手动创建将每个属性从源复制到目标的方法之前 我想我应该在这里寻求更好的解决方案 我有 2 个对象 一个是 Customer CustomerParty 类型 另一个是 Appointm
  • 使用 C# 和 ASP.NET 在电子邮件附件中发送 SQL 报告

    我正在尝试使用 ASP NET 和 C 从 sql reportserver 2008 作为电子邮件附件发送报告 到目前为止我学会了如何获取 PDF 格式的报告 http weblogs asp net srkirkland archive
  • 如何修复错误:“检测到无法访问的代码”

    我有以下代码 private string GetAnswer private int CountLeapYears DateTime startDate return count String answer GetAnswer Respo
  • Android NDK 代码中的 SIGILL

    我在市场上有一个 NDK 应用程序 并获得了有关以下内容的本机崩溃报告 SIGILL信号 我使用 Google Breakpad 生成本机崩溃报告 以下是详细信息 我的应用程序是为armeabi v7a with霓虹灯支持 它在 NVIDI
  • 保证复制省略是否适用于函数参数?

    如果我理解正确的话 从 C 17 开始 这段代码现在要求不进行任何复制 Foo myfunc void return Foo auto foo myfunc no copy 函数参数也是如此吗 下面的代码中的副本会被优化掉吗 Foo myf
  • SQLAPI++ 的免费替代品? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有任何免费 也许是开源 的替代品SQLAPI http www sqlapi com 这个库看起来
  • .NET 和 Mono 之间的开发差异

    我正在研究 Mono 和 NET C 将来当项目开发时我们需要在 Linux 服务器上运行代码 此时我一直在研究 ASP NET MVC 和 Mono 我运行 Ubuntu 发行版 想要开发 Web 应用程序 其他一些开发人员使用 Wind
  • Unity3D - 将 UI 对象移动到屏幕中心,同时保持其父子关系

    我有一个 UI 图像 它的父级是 RectTransform 容器 该容器的父级是 UI 面板 而 UI 面板的父级是 Canvas 我希望能够将此 UI 图像移动到屏幕中心 即画布 同时保留父级层次结构 我的目标是将 UI 图像从中心动画
  • 如何获取带有某个属性注释的所有属性?

    我刚刚从 Roslyn 开始 我想找到所有用属性名称 OneToOne 注释的属性 我启动了 SyntaxVisualizer 并能够获取对该节点的引用 但我想知道是否有更简单的方法来实现此目的 这就是我所拥有的 var prop docu
  • 如何组合两个 lambda [重复]

    这个问题在这里已经有答案了 可能的重复 在 C 中组合两个 lambda 表达式 https stackoverflow com questions 1717444 combining two lamba expressions in c
  • 如果将变量设置为等于新对象,旧对象会发生什么?

    假设我们有一个 X 类not有一个超载的operator 功能 class X int n X n 0 X int n n n int main X a 1 an object gets constructed here more code
  • winform c# 中的弹出窗口

    我正在开发一个需要弹出窗口的项目 但问题是我还希望能够通过表单设计器在此弹出窗口中添加文本框等 所以基本上我有一个按钮 当您单击它时 它将打开我在表单设计器中设计的另一个窗口 我一直在谷歌搜索 但还没有找到我需要的东西 所以我希望你们能帮助
  • ContentDialog Windows 10 Mobile XAML - 全屏 - 填充

    我在项目中放置了一个 ContentDialog 用于 Windows 10 上的登录弹出窗口 当我在移动设备上运行此项目时 ContentDialog 未全屏显示 并且该元素周围有最小的填充 在键盘上可见 例如在焦点元素文本框上 键盘和内
  • 如何在 ASP.NET Core 中注入泛型的依赖关系

    我有以下存储库类 public class TestRepository Repository

随机推荐

  • 如何防止 .htaccess 在特定目录中使用?

    我有一个网站 可以说 http www example com 我正在使用重写模块 但我有一个子文件夹forum example com 我不想要 htaccess要影响这个目录 我该怎么做 If your forum domain com
  • 将参数发送到 Web 服务

    开始之前 我正在使用 Objective C 为 Iphone 编程 我已经使用 NSURLRequest 和 NSURLConnection 实现了对 Web 服务函数的调用 然后该函数返回一个包含我需要的信息的 XML 代码如下 NSU
  • Rails 3,将局部变量传递给部分[重复]

    这个问题在这里已经有答案了 可能的重复 Rails 对将局部变量传递给局部变量的语法感到困惑 https stackoverflow com questions 4402556 rails confused about syntax for
  • 从图像中获取像素颜色[重复]

    这个问题在这里已经有答案了 我在浏览器上有一张图片 我想获取图像颜色的左上角像素 坐标 0 0 无论图像是否旋转 我该如何使用 javascript 或 php 代码来做到这一点 创建画布文档 createElement 获取二维上下文ca
  • 在 tmux 下使用 $TERM='screen-256color' 时,HOME 和 END 键不起作用。为什么?

    我已经设置了 tmux TERM被设置为screen 256color正确 这工作正常 并且颜色设置正确 但是它阻止我发送HOME and END终端的密钥 而是打印为F n and H n 我应该补充一点 home 似乎可以在 irssi
  • 支持 IE11 的 vue cli3 lib

    根据文档 https cli vuejs org guide build targets html library https cli vuejs org guide build targets html library 我不清楚如何集成
  • 在 Node WebKit 中启用触摸事件

    我使用自定义触摸屏 我想默认激活触摸事件节点 webkit https github com rogerwang node webkit 那可能吗 This one https github com rogerwang node webki
  • 如何在不看到控制台的情况下检测unity c#运行时是否有错误? [复制]

    这个问题在这里已经有答案了 是否可以在不读取控制台日志的情况下检测在 Unity 中运行的 C 脚本中的错误 当我必须构建游戏并在手机中测试它时 我需要这个 如果运行时出现错误 它将显示一个消息框来显示错误 据我了解 我们可以使用Unity
  • 如何在 .NET Core 的主布局视图中渲染特定控制器的操作?

    我正在打电话 TopNav 部分来自内部Layout主视图 I want TopNav要强类型化的视图和要在其中创建的模型TopNavController 有什么方法可以从主视图中渲染特定控制器的操作吗 所以在这种情况下我需要渲染TopNa
  • 覆盖后退按钮以充当主页按钮

    按下后退按钮后 我希望我的应用程序进入停止状态 而不是销毁状态 在安卓中docs http developer android com intl fr guide practices ui guidelines activity task
  • @WithUserDetails 似乎不起作用

    我有一个应用程序 其中使用 Spring Social Security 进行身份验证和授权 不幸的是 我在模拟 Spring Security 时遇到了一些问题 似乎根本不起作用 我有一个 REST 控制器 如果它应该返回的实体的标识符不
  • 如何使用MessageUI框架在iPhone上发送iMessage消息

    是否可以使用 iPhone 上的 MessageUI 框架从应用程序内部发送消息 或者 有 iMessage 的 URL 方案吗 使用 iOS 4 您可以从应用程序内部发送电子邮件和短信 使用 MessagUI 视图控制器 由于 iOS 5
  • 用于 Java 的 ANTLR4。如何显示词法分析中的错误

    如何在词法分析过程中显示错误列表 如果有 我尝试了以下方法 但我的输出是 org antlr v4 runtime ConsoleErrorListener 1026c84c 我写的代码 private static String erro
  • 开源 php docx 到 pdf 转换?

    是否有任何开源 PHP 工具可以用来将 doc docx 转换为 pdf 如果您有任何好的教程或工具 将不胜感激 我正在研究 phpLiveDocx 但看起来他们按月收费 或者也许是 php 或 linux 中的 odt 到 pdf 尝试
  • Oracle 10g 上的独占表(读)锁?

    有没有办法在 Oracle 10g 中独占锁定表以进行读取 我对Oracle不是很熟悉 所以我问了DBA 他说在Oracle中不可能锁定一个表来读取 我实际上正在寻找类似 SQL Server TABLOCKX HOLDLOCK 提示的内容
  • 单击标签不会单击 React 中的复选框?

    我创建了一个表单 用户可以在提交表单之前选择选项 我隐藏复选框display none我正在设计
  • Pandas:填充缺失日期的数据

    假设我有下表 ProdID Date Val1 Val2 Val3 Prod1 4 1 2019 1 3 4 Prod1 4 3 2019 2 3 54 Prod1 4 4 2019 3 4 54 Prod2 4 1 2019 1 3 3
  • 调用其他线程调用的函数时,线程未启动

    我正在使用线程来显示进度窗口 同时执行耗时的操作 for 循环 在该操作之后 我想停止线程 但是该方法 显示进度对话框 没有被调用 我在其他事件中使用相同的方法 效果很好 下面是代码 Private Sub TSBRSToLoc Click
  • sort/2、keysort/2 与 samsort/3、predsort/3

    ISO Prolog 提供sort 2 and keysort 2它依赖于术语顺序 7 2 通常称为 标准术语顺序 以不同顺序对列表进行排序的常见方法是映射每个元素El以某种方式将该列表转换为成对列表XKey El然后对该列表进行排序 最后
  • 用于多级查询的动态 Linq 表达式

    我想动态构建以下 Linq 表达式 我遇到的问题是我无法构建表达式树来容纳复杂的 Select Any 语句 我读过 为了使用方法 您实际上必须调用该方法 如下所示 Invoke Any 我需要动态构建的表达式 Expression