使用表达式创建带有嵌套类的谓词

2024-01-21

我有这个 :

public class Company
{
    public int Id { get; set; }
    public string Name { get; set; }
}
public class City
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int ZipCode { get; set; }
}
public class Person
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int? Age { get; set; }
    public City City { get; set; }
    public Company Company { get; set; }
}

我希望在某些情况下生成这样的谓词:

var result = listPerson.Where(x => x.Age == 10).ToList<>();

或这个 :

var result  = listPerson.Where( x => x.Company.Name == 1234).ToList();

或这个 :

var result  = listPerson.Where( x => x.City.ZipCode == "MyZipCode").ToList();

或这个 :

var result  = listPerson.Where( x => x.Company.Name == "MyCompanyName").ToList();

然后我创建了一个“PredicateBuilder”,当我这样做时,这就是工作(我得到类型,如果可以为空或不可为空,然后构建谓词):

BuildPredicate<Person>("Age", 10); I get this : x => x.Age == 10

但当存在这样的嵌套属性时,我不知道如何管理:

BuildPredicate<Person>("City.ZipCode", "MyZipCode"); 
I'd like get this : x => x.City.ZipCode == "MyZipCode"

或这个 :

BuildPredicate<Person>("City.Name", "MyName"); 
I'd like get this : x => x.City.Name == "MyName"

或这个 :

BuildPredicate<Person>("Company.Name", "MyCompanyName"); 
I'd like get this : x => x.Company.Name == "MyCompanyName"

(无意重复乔恩 - OP联系我提供答案)

以下似乎工作正常:

static Expression<Func<T,bool>> BuildPredicate<T>(string member, object value) {
    var p = Expression.Parameter(typeof(T));
    Expression body = p;
    foreach (var subMember in member.Split('.')) {
        body = Expression.PropertyOrField(body, subMember);
    }
    return Expression.Lambda<Func<T, bool>>(Expression.Equal(
        body, Expression.Constant(value, body.Type)), p);
}

与乔恩的答案之间唯一的功能区别是它处理null slightly更好的是,通过告诉Expression.Constant预期的类型是什么。作为用法演示:

static void Main() {
    var pred = BuildPredicate<Person>("City.Name", "MyCity");

    var people = new[] {
        new Person { City = new City { Name = "Somewhere Else"} },
        new Person { City = new City { Name = "MyCity"} },
    };
    var person = people.AsQueryable().Single(pred);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用表达式创建带有嵌套类的谓词 的相关文章

随机推荐

  • CSS 过渡表格行高

    我有一个 CSS 表 所有行的高度相同 但当用户单击其中一行时 所选行应占据整个表格高度 其余行应逐渐消失 我通过简单的设置就可以工作display none在所有其他行上 但我想做一些过渡 我尝试过设置max height到 100 然后
  • 如何使用boto3通过另一个帐户的SQS订阅一个帐户的SNS主题?

    我正在尝试在一个帐户中创建一个 SNS 主题并将其附加到配置规则 我有 3 个这样的帐户 并且想在每个帐户中创建 SNS 主题 现在我想通过第四个帐户的SQS订阅3个不同帐户的所有3个主题 我可以手动完成 有人可以告诉我如何通过 boto3
  • google-apps-script 更改列格式

    需要格式化列 c e 和其他一些列 以使用以下格式显示日期 2014 年 7 月 4 日 不知道该怎么做 谷歌脚本新手 要使用 Apps 脚本执行此操作 您可以使用设置数字格式 数字格式 https developers google co
  • SSL 是如何工作的?

    我知道这不是一个具体的问题 但我阅读了这个主题大约一个小时 但找不到任何有关它的基本信息 SSL 是如何工作的 什么是私钥和公钥 为什么必须在公司购买证书以及自己签署证书有什么区别 到底什么是这样的证书 我读过几个网站 维基百科信息 Sta
  • Python:减少字典的内存使用

    我正在尝试将几个文件加载到内存中 这些文件具有以下 3 种格式之一 字符串 TAB 整型 字符串 TAB 浮点数 int TAB 浮点数 事实上 它们是 ngram 静态文件 以防这有助于解决问题 例如 i love TAB 10 love
  • Angular 2 - 服务在调用方法之前消耗其他服务

    我有这样的场景 后端 json devServer http server1 proServer http server2 use devServer 全局服务 ts import Injectable from angular core
  • 在哪里可以找到 C++11 标准论文? [复制]

    这个问题在这里已经有答案了 可能的重复 在哪里可以找到当前的 C 或 C 标准文档 https stackoverflow com questions 81656 where do i find the current c or c sta
  • FFMPEG API:如何使用 av_open_input_file 连接到 RTSP 流?

    我正在尝试使用 av open input file 连接到一些 RTSP 流 如下所示 AVFormatContext ic avcodec register all av register all av open input file
  • Java 中可序列化和外部化有什么区别?

    有什么区别Serializable http java sun com javase 6 docs api java io Serializable html and Externalizable http java sun com jav
  • 冒泡排序与选择排序相比如何?

    哪种排序技术更快 冒泡排序或选择排序 为什么 两者效率相同吗 维基百科 http en wikipedia org wiki Selection sort说 强调 Among simple average case n2 algorithm
  • 如何通过拒绝selenium webdriver中的弹出窗口来关闭浏览器

    我有一个测试用例 登录后 在某个页面上 当用户尝试关闭浏览器时 它将显示弹出窗口 警报 询问 您可能会丢失数据 确定要继续吗 有两个选项 离开页面 留在页面上 单击特定选项 页面将执行操作 留在页面 不会离开页面 离开页面 将关闭浏览器 现
  • 使用实体框架时,是否可以强制生成的实体类为 Pascal 大小写?

    我正在使用的数据库具有诸如 table name 之类的表名称 很好 但我想生成 TableName 格式的类 以便在 C Pascal 风格中使用 这可能吗 更新 要与 EF6 一起使用 请参阅本页上的其他答案 谢谢亚历克斯的回答 htt
  • ASP.NET Web API 基本身份验证授权标头

    我有一个BasicAuthenticationAttribute检查请求中的 Authorization 标头 但尽管它存在 它仍然认为 Authorization 标头为空 public class BasicAuthentication
  • 测试 Bash 中字符串是否包含非空白字符

    我的脚本正在读取并显示 id3 标签 我试图让它回显未知字段是否为空 但我尝试的每个 if 语句都不起作用 id3 标签是固定大小的 因此它们永远不会为空 但如果没有值 它们会用空格填充 即标题标签的长度为 30 个字符 到目前为止我已经尝
  • 如何在重定向 Express 4 之前找到原始请求路径

    假设我正在尝试访问该路径http localhost 3000 users WyCrYc28r foo 1414585518343 但路径 users仅需要经过身份验证的用户才能访问 如下所示 app get users isLoggedI
  • 如何检测在 Windows Phone 7 中选择了枢轴项目

    我正在 Windows Phone 7 中实现 Pivot 控件 我想知道在用户进行滑动手势后哪个枢轴项目被选择并处于活动状态 如何检测与Pivot控件相关的滑动手势事件 我应该使用哪种委托方法 SelectionChanged 是连接到的
  • 是否可以在不启动另一个进程的情况下提升UAC进程

    我想知道程序是否可以通过 UAC 提示来提示用户提升自己的权限 而无需启动另一个进程 我在互联网上找到的所有示例似乎都是 ShellExecute runas 它创建了一个具有提升权限的新进程 如果这是不可能的 那么我想我最好的解决方案是创
  • 在 Angular 5 / TypeScript 中获取类(接口)属性而不分配默认值

    假设我有一个接口 A 我按照 Angular 风格指南将其声明为一个类 这个类有很多属性 我想获取它们的名称 而不必为它们分配任何值 我怎样才能做到这一点 Class A export class A property1 string pr
  • segue后屏幕变黑

    我尝试对此进行调试但无济于事 基本上 当我从第一个视图控制器切换到第二个视图控制器时 屏幕会暂时变黑 代码按照我想要的方式执行 但是屏幕变黑对我来说有点痛苦 这是代码 从第一页开始的segue func mapView mapView MG
  • 使用表达式创建带有嵌套类的谓词

    我有这个 public class Company public int Id get set public string Name get set public class City public int Id get set publi