是否可以将反射与 linq to 实体一起使用?

2023-11-26

我试图通过创建一个扩展方法来一般处理过滤来清理我的代码。

这是我试图清理的代码。

var queryResult = (from r in dc.Retailers select r);
if (!string.IsNullOrEmpty(firstName))
    queryResult = queryResult.Where(ex => SqlFunctions.PatIndex(firstName.Trim(), ex.FirstName.Trim()) > 0);
if (!string.IsNullOrEmpty(lastName))
    queryResult = queryResult.Where(ex => SqlFunctions.PatIndex(lastName.Trim(), ex.LastName.Trim()) > 0);
if (!string.IsNullOrEmpty(companyName))
    queryResult = queryResult.Where(ex => SqlFunctions.PatIndex(companyName.Trim(), ex.CompanyName.Trim()) > 0);
if (!string.IsNullOrEmpty(phone))
    queryResult = queryResult.Where(ex => SqlFunctions.PatIndex(phone.Trim(), ex.Phone.Trim()) > 0);
if (!string.IsNullOrEmpty(email))
    queryResult = queryResult.Where(ex => SqlFunctions.PatIndex(email.Trim(), ex.Email.Trim()) > 0);
if (!string.IsNullOrEmpty(city))
    queryResult = queryResult.Where(ex => SqlFunctions.PatIndex(city.Trim(), ex.City.Trim()) > 0);
if (!string.IsNullOrEmpty(zip))
    queryResult = queryResult.Where(ex => SqlFunctions.PatIndex(zip.Trim(), ex.Zip.Trim()) > 0);
if (!string.IsNullOrEmpty(country))
    queryResult = queryResult.Where(ex => SqlFunctions.PatIndex(country.Trim(), ex.Country.Trim()) > 0);
if (!string.IsNullOrEmpty(state))
    queryResult = queryResult.Where(ex => SqlFunctions.PatIndex(state.Trim(), ex.State.Trim()) > 0);

这显然是非常重复的。因此,我尝试创建一个使用反射按属性进行过滤的扩展方法。这是方法。

public static void FilterByValue<T>(this IQueryable<T> obj, string propertyName, string propertyValue)
{
    if (!string.IsNullOrEmpty(propertyValue))
    {
        obj =
            obj.Where(
                ex =>
                    SqlFunctions.PatIndex(propertyValue.Trim(), (string)typeof(T).GetProperty(propertyName,
                        BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase).GetValue(ex)) > 0
                    );
    }
}

它的名字是这样的:

var queryResult = (from r in dc.Retailers select r);
queryResult.FilterByValue("firstname", firstName);

但是,当 linq 执行时,我收到错误,指出 linq to 实体中无法识别“GetValue”。

那么,有没有其他方法可以清理它,或者我必须让它变得丑陋?


从技术上讲,是的,你可以做到,但你需要构建Expression自己传递给Where.

也就是说,您应该考虑接受一个字符串值,而不是接受该属性Expression<Func<T, string>>作为参数,以便您可以在编译时支持验证所选对象是否有效。

我们将从代表通用部分的表达式开始;它将表示一个带有*两个*参数、对象和给定属性的值的函数。然后,我们可以用我们在实际方法的参数中定义的属性选择器替换第二个参数的所有实例。

public static IQueryable<T> FilterByValue<T>(
    this IQueryable<T> obj,
    Expression<Func<T, string>> propertySelector,
    string propertyValue)
{
    if (!string.IsNullOrEmpty(propertyValue))
    {
        Expression<Func<T, string, bool>> expression =
            (ex, value) => SqlFunctions.PatIndex(propertyValue.Trim(),
                value.Trim()) > 0;

        var newSelector = propertySelector.Body.Replace(
            propertySelector.Parameters[0],
            expression.Parameters[0]);

        var body = expression.Body.Replace(expression.Parameters[1], 
            newSelector);
        var lambda = Expression.Lambda<Func<T, bool>>(
            body, expression.Parameters[0]);

        return obj.Where(lambda);
    }
    else
        return obj;
}

此方法使用一个函数将给定表达式中一个表达式的所有实例替换为另一个表达式的实例。其实现是:

public class ReplaceVisitor : ExpressionVisitor
{
    private readonly Expression from, to;
    public ReplaceVisitor(Expression from, Expression to)
    {
        this.from = from;
        this.to = to;
    }
    public override Expression Visit(Expression node)
    {
        return node == from ? to : base.Visit(node);
    }
}

public static Expression Replace(this Expression expression,
    Expression searchEx, Expression replaceEx)
{
    return new ReplaceVisitor(searchEx, replaceEx).Visit(expression);
}

If you really想要接受属性名称作为字符串然后只需替换定义newSelector具有以下内容:

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

是否可以将反射与 linq to 实体一起使用? 的相关文章

  • 向 Nhibernate 发出 SQL 查询

    如何将此 SQL 查询发送给 Nhibernate SELECT Customer name FROM Company INNER JOIN Customer ON Company CompanyId Customer CompanyId
  • ADO EF Code First 通用中间类继承映射

    我有以下要求 该要求在 OO 空间中运行良好 但我似乎无法首先使用 ADO EF 代码将其映射回数据库 我有许多产品 每个产品都有不同的方面 属性 但不是代码属性意义上的 例如 戒指将具有矿物类型 金等方面 而钻石将具有净度方面 VVSI1
  • 在新的浏览器进程中打开 URL

    我需要在新的浏览器进程中打开 URL 当浏览器进程退出时我需要收到通知 我当前使用的代码如下 Process browser new Process browser EnableRaisingEvents true browser Star
  • 在 Unity 进程和另一个 C# 进程之间进行本地 IPC 的最快方法 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我希望每秒大约 30 次从 C 应用程序向我的 Unity 应用程序传送大量数据 由于 Unity 不支持映射内存和管道 我考虑了 t
  • XamlReader.Load 在后台线程中。是否可以?

    WPF 应用程序具有从单独的文件加载用户控件的操作 使用XamlReader Load method StreamReader mysr new StreamReader pathToFile DependencyObject rootOb
  • C++中的类查找结构体数组

    我正在尝试创建一个结构数组 它将输入字符串链接到类 如下所示 struct string command CommandPath cPath cPathLookup set an alarm AlarmCommandPath send an
  • 在 C# 中循环遍历文件文件夹的最简单方法是什么?

    我尝试编写一个程序 使用包含相关文件路径的配置文件来导航本地文件系统 我的问题是 在 C 中执行文件 I O 这将是从桌面应用程序到服务器并返回 和文件系统导航时使用的最佳实践是什么 我知道如何谷歌 并且找到了几种解决方案 但我想知道各种功
  • 生成(非常)大的非重复整数序列而不进行预洗牌

    背景 我编写了一个简单的媒体客户端 服务器 我想生成一个不明显的时间值 随从客户端到服务器的每个命令一起发送 时间戳中将包含相当多的数据 纳秒分辨率 即使它不是真正准确 因为现代操作系统中计时器采样的限制 等 我想做的 在 Linux 上
  • 获取 WPF 控件的所有附加事件处理程序

    我正在开发一个应用程序 在其中动态分配按钮的事件 现在的问题是 我希望获取按钮单击事件的所有事件 因为我希望删除以前的处理程序 我尝试将事件处理程序设置为 null 如下所示 Button Click null 但是我收到了一个无法分配 n
  • 使用 JNI 从 Java 代码中检索 String 值的内存泄漏

    我使用 GetStringUTFChars 从使用 JNI 的 java 代码中检索字符串的值 并使用 ReleaseStringUTFChars 释放该字符串 当代码在 JRE 1 4 上运行时 不会出现内存泄漏 但如果相同的代码在 JR
  • C++:.bmp 到文件中的字节数组

    是的 我已经解决了与此相关的其他问题 但我发现它们没有太大帮助 他们提供了一些帮助 但我仍然有点困惑 所以这是我需要做的 我们有一个 132x65 的屏幕 我有一个 132x65 的 bmp 我想遍历 bmp 并将其分成小的 1x8 列以获
  • 批量更新 SQL Server C#

    我有一个 270k 行的数据库 带有主键mid和一个名为value 我有一个包含中值和值的文本文件 现在我想更新表格 以便将每个值分配给正确的中间值 我当前的方法是从 C 读取文本文件 并为我读取的每一行更新表中的一行 必须有更快的方法来做
  • Visual Studio 中的测试单独成功,但一组失败

    当我在 Visual Studio 中单独运行测试时 它们都顺利通过 然而 当我同时运行所有这些时 有些通过 有些失败 我尝试在每个测试方法之间暂停 1 秒 但没有成功 有任何想法吗 在此先感谢您的帮助 你们可能有一些共享数据 检查正在使用
  • 如何将自定义 JSON 文件添加到 IConfiguration 中?

    我正在使用 asp net Autofac 我正在尝试加载自定义 JSON 配置文件 并基于该文件创建 实例化 IConfiguration 实例 或者至少将我的文件包含到默认情况下构建的 IConfiguration asp net 中
  • 如何使用 Mongodb C# 驱动程序连接多个集合

    我需要将 3 个集合与多个集合合并在一起 lookup我在 C 驱动程序中尝试过 它允许我 lookup用户采集但无法执行秒 lookup用于设置集合 有人可以帮忙吗 db Transactions aggregate lookup fro
  • HttpWebRequest 在第二次调用时超时

    为什么以下代码在第二次 及后续 运行时超时 代码挂在 using Stream objStream request GetResponse GetResponseStream 然后引发 WebException 表示请求已超时 我已经尝试过
  • 如何从main方法调用业务对象类?

    我已将代码分为业务对象 访问层 如下所示 void Main Business object public class ExpenseBO public void MakeExpense ExpensePayload payload var
  • Server.MapPath - 给定的物理路径,预期的虚拟路径

    我正在使用这行代码 var files Directory GetFiles Server MapPath E ftproot sales 在文件夹中查找文件 但是我收到错误消息说 给定物理路径但虚拟路径 预期的 我对在 C 中使用 Sys
  • 如何将 Roslyn 语义模型返回的类型符号名称与 Mono.Cecil 返回的类型符号名称相匹配?

    我有以下代码 var paramDeclType m semanticModel GetTypeInfo paramDecl Type Type Where paramDeclType ToString returns System Col
  • 在客户端系统中安装后桌面应用程序无法打开

    我目前正在使用 Visual Studio 2017 和 4 6 1 net 框架 我为桌面应用程序创建了安装文件 安装程序在我的系统中完美安装并运行 问题是安装程序在其他计算机上成功安装 但应用程序无法打开 edit 在客户端系统中下载了

随机推荐

  • Spring @Transactional 注释不能与自动装配一起使用?

    我的应用程序使用 Spring 自动装配来配置 bean 我刚刚尝试添加 Transactional 预期的代理似乎没有被调用 我希望 PersonalController 使用事务代理包装的 UpdatePublicMapService
  • 从 dotnet Core 2.2.6 更改为 3.0.0 后出现 EF Linq 错误

    我正在尝试将解决方案升级到新的 Core Framework 3 0 0 现在我有一个小问题我不明白 看一下 这个方法在2 2 6中是没有问题的 public async Task
  • Gulp 错误:观看 ENOSPC

    您好 我在运行 gulp watch 时收到此错误 我在用着vueify在 Laravel 项目中 为什么会发生这种情况 这几天一直运行良好 今天就到了 gulp watch 12 56 01 Using gulpfile Document
  • 成功的特定领域语言?您使用哪一款? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我对领域特定语言的设计和实
  • 在 EAP 6.4.0 中使用 JPA 2.1

    我寻找这个问题的解决方案 到目前为止还没有成功 我们正在将应用程序迁移到 EAP 6 4 0 并且我们的应用程序依赖于 JPA 2 1 然而 JBoss 是一个 Java EE 6 服务器 因此以模块的形式包含 JPA 2 0 我尝试将 J
  • 如何使用 JavaScript 导航到不同的页面

    我目前正在使用以下代码将用户重定向到 C 中的另一个页面 Response Redirect somepage aspx 不过 我想用 JavaScript 来完成此操作 试试下面的代码
  • 如何从SQLite数据库中获取特定月份的数据

    我将数据保存在 SQLite 数据库中 我将日期保存在数据库中作为 DATETIME 数据类型 我只想从 SQLite 数据库中检索特定月份的数据 我尝试使用以下查询来检索数据 但它没有用 它为我提供了数据 但不是特定月份 SELECT c
  • 如何在集群中运行的节点中选举主节点?

    我正在编写一个托管云堆栈 在 EC2 等硬件级云提供商之上 我很快将面临的一个问题是 几个相同的节点如何决定其中哪一个成为主节点 即考虑在 EC2 上运行 5 台服务器 其中一台必须成为主服务器 其他服务器必须成为从服务器 我读到了一个描述
  • 删除 Django 登录表单中电子邮件的区分大小写

    我创建了一个自定义 UserModel 并使用电子邮件作为主要身份验证 ID 而不是用户名 问题是大小写敏感 因为它很重要 电子邮件受保护 电子邮件受保护 作为2个不同的帐户 我需要强制它作为 1 个帐户来处理 忽略它是大写还是小写 这是我
  • 如何在 CI 服务器上的 ASP.NET 网站上使用 NuGet 包

    我有许多 ASP NET Web 表单网站 没有 csproj 文件的网站 我正在尝试找出如何最好地使用它们的 NuGet 包 使用 Visual Studio 2015 时 通过 UI 添加 NuGet 包可以正常工作 站点根目录中有一个
  • 如何获得一个国家的城市边界

    我想从芬兰的 OSM 中提取城市特定数据 我有芬兰的数据 但我只需要 5 个城市的数据 赫尔辛基 埃斯波 万塔 考尼亚宁和 Siuntio 我可以提取赫尔辛基所需的数据 但我需要其余城市的城市边界 这样我可以制作一个多边形 如果我有多边形
  • python 中关键字参数值的命名空间是什么?

    我知道自从我发现 python 以不同的方式对待这个命名空间 def foo l l append 1 print l foo foo foo foo 打印以下内容 1 1 1 1 1 1 1 所以我对它们用作对象初始值设定项持怀疑态度 然
  • 如何获取 StackPanel 中元素的位置?

    假设我有一个 StackPanel 它会动态填充副本 从而更改其中元素的 Y 位置 我在该 StackPanel 中有一个特定元素 我想在 StackPanel 重新定位其所有子元素后找到该元素的 Y 位置 相对于 StackPanel 或
  • Python 2.7 如何解析格式为 2014-05-01 18:10:38-04:00 [重复]

    这个问题在这里已经有答案了 我正在尝试解析这个日期时间字符串 但尚未成功 我该如何获取它 d 2014 05 01 18 10 38 04 00 datetime datetime strptime d Y m d H M S Z Valu
  • 安装 Homebrew Python 后 Python 包位于错误的位置?

    将 Homebrew 的 Python 安装到已安装 Apple Python 的系统上后 列出的最后一个条目sys path使用 Homebrew 的 Python 是 Library Python 2 7 site packages u
  • 将 pandas DateTimeIndex 转换为 Unix 时间?

    将 pandas DateTimeIndex 转换为 Unix 时间 可迭代 的惯用方法是什么 这可能不是要走的路 time mktime t timetuple for t in my data frame index to pydate
  • Python 3.3+ 中的包不需要 __init__.py

    我正在使用Python 3 5 1 我在这里阅读了文档和包部分 https docs python org 3 tutorial modules html packages 现在 我有以下结构 home wujek Playground a
  • 如何从 API Platform 文档中隐藏路由

    我正在 Symfony 4 下使用 API Platform 构建 API 我想隐藏文档中的一个实体 该实体只能由打击的 ROLE ADMIN 访问 没有兴趣在文档中可见 这是我要隐藏的实体
  • IE 中的文本区域不会显示换行符

    使用 jQuery 的 load 方法我将文本加载到文本区域中 在 Chrome 和 FF 中运行良好 与往常一样 IE 必须有所不同 并且不会显示换行符 我试过了white space pre wrap没有运气 有任何想法吗 My cod
  • 是否可以将反射与 linq to 实体一起使用?

    我试图通过创建一个扩展方法来一般处理过滤来清理我的代码 这是我试图清理的代码 var queryResult from r in dc Retailers select r if string IsNullOrEmpty firstName