如何在 LINQ to Entities 查询中实现查询拦截? (C#)

2023-12-23

我正在尝试在 EF4 中实现加密列,并使用 CTP5 功能来允许简单地使用 POCO 来查询数据库。抱歉,这是很多话,但我希望下面的内容足以解释需求和问题!

那么,一些背景知识以及我迄今为止的进展:

目的是,如果您在不使用我们的 DAL 的情况下查询表,那么数据就是垃圾,但我不希望开发人员担心数据是否/何时/如何加密。

为简单起见,现阶段我假设任何字符串列都将被加密。

现在,我已经成功实现了使用 Objectmaterialized 事件返回数据以及使用 SavingChanges 事件提交数据的功能。

因此给出以下课程:

public class Thing
{

    public int ID { get; set; }
    [Required]
    public string Name { get; set; }
    public DateTime Date { get; set; }
    public string OtherString { get; set; }
}

以下查询返回所有必需的值,并且 POCO 物化中包含清晰的数据。

var things = from t in myDbContext.Things
             select t;

其中 myDbContext.Things 是DbSet<Thing>

同样,传递一个实例Thing to Things.Add()
(名称和/或其他字符串值中包含清晰的字符串数据)
然后打电话myDbContext.SaveChanges()在字符串到达​​数据存储之前对其进行加密。

现在,我遇到的问题是在这个查询中:

var things = from t in myDbContext.Things
             where t.Name == "Hairbrush"
             select t;

这会导致将未加密的值与数据库中的加密值进行比较。显然我不想从数据库中获取所有记录,具体化它们,然后根据任何提供的Where子句过滤结果......所以我需要做的是:拦截该查询并通过加密Where子句中的任何字符串来重写它。所以我看过:

  • 编写一个查询提供程序,但这似乎不是正确的解决方案......(is it?)
  • 为 DbSet 编写我自己的 IQueryable 包装器,它将捕获表达式,使用表达式树访问者运行它,然后将新表达式转发到 DbSet...

这两种尝试都让我有些迷失!我认为我更喜欢第二种解决方案,因为它感觉更简洁,并且将来对其他开发人员来说可能更清晰。但我很乐意与其中一个或另一个一起去better选项!!

我遇到的主要问题是 LINQ 表达式何时/如何应用于对象...我想我自己对表达式在 IQueryable 对象中执行的位置有点困惑,因此我不确定哪种方法我需要在我的包装器中实现,然后抓取和操作传入的表达式......

我确信我在这里遗漏了一些相当明显的东西,我正在等待那个灵光乍现的时刻……但它没有来!

任何帮助将非常感激!


我想让你知道我的最终解决方案是什么。 最后,我使用了一个包装类,它实现了Where 方法,但没有达到完全实现IQueryable 的程度。 LINQ 仍将针对该类执行(至少在我想要/需要的范围内),并将使用 LINQ 中的表达式调用Where 方法。

然后,我遍历此表达式树并用加密值替换字符串,然后将新的表达式树转发到内部 DbSet。然后返回结果。

它相当粗糙,并且有其局限性,但对于我们的特定情况来说没有问题。

谢谢, 本

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

如何在 LINQ to Entities 查询中实现查询拦截? (C#) 的相关文章

  • 尝试了解使用服务打开对话框

    我已经阅读了有关使用 mvvm 模式打开对话框的讨论 我看过几个使用服务的示例 但我不明白所有部分如何组合在一起 我发布这个问题寻求指导 以了解我应该阅读哪些内容 以更好地理解我所缺少的内容 我将在下面发布我所拥有的内容 它确实有效 但从我
  • C# 方法重载决策不选择具体的泛型覆盖

    这个完整的 C 程序说明了这个问题 public abstract class Executor
  • Grpc - 将消息从一个客户端发送到连接到同一服务器的另一个客户端

    是否可以将消息从一个客户端发送到连接到同一服务器的另一个客户端 我想将数据从一个客户端发送到服务器然后发送到特定客户端 我想我需要获取客户端 ID 但我不知道如何获取此 ID 以及如何从服务器将此消息发送到该客户端 我这里有一个样本 这是一
  • 将类对象放置在向量中?

    我注意到我可以将一个类放置在一个向量中 这是我的程序 我收到以下错误 out blackjack exe blackjack obj blackjack obj error LNK2019 unresolved external symbo
  • 未找到 Boost 库,但编译正常

    我正在尝试在 C 中使用 boost 的文件系统 使用时看起来编译没问题 c c Analyse c o Analyse o g W Wall L usr local lib lboost filesystem lboost system
  • 如何将 SOLID 原则应用到现有项目中

    我对这个问题的主观性表示歉意 但我有点卡住了 我希望之前处理过这个问题的人能够提供一些指导和建议 我有 现在已经成为 一个用 C 2 0 编写的非常大的 RESTful API 项目 并且我的一些类已经变得巨大 我的主要 API 类就是一个
  • extern 声明和函数定义都在同一文件中

    我只是浏览了一下gcc源文件 在gcc c 我发现了类似的东西 extern int main int char int main int argc char argv 现在我的疑问是extern是告诉编译器特定的函数不在这个文件中 但可以
  • 强制初始化模板类的静态数据成员

    关于模板类的静态数据成员未初始化存在一些问题 不幸的是 这些都没有能够帮助我解决我的具体问题的答案 我有一个模板类 它有一个静态数据成员 必须为特定类型显式实例化 即必须专门化 如果不是这种情况 使用不同的模板函数应该会导致链接器错误 这是
  • cpp.react库的C++源代码中奇怪的“->* []”表达式

    这是我在文档中找到的 C 片段cpp react 库 https github com schlangster cpp react implicit parallelism auto in D MakeVar 0 auto op1 in g
  • 如何使用 Regex.Replace 从字符串中删除数字?

    我需要使用Regex Replace从字符串中删除所有数字和符号 输入示例 123 abcd33输出示例 abcd 请尝试以下操作 var output Regex Replace input d string Empty The d标识符
  • 如何将AVFrame转换为glTexImage2D使用的纹理?

    如您所知 AVFrame 有 2 个属性 pFrame gt data pFrame gt linesize 当我从视频 sdcard test mp4 android平台 读取帧后 并将其转换为RGB AVFrame副 img conve
  • 在 .NET MAUI 中实现 TouchTracking

    我一直致力于将我们的应用程序从 Xamarin Forms 迁移到 NET MAUI 我们的应用程序几乎没有绘图功能 用户可以用手指进行绘图 我们用了TouchTrackingXamarin Forms 中的 nuget 包 但与 NET
  • 已发布的 .Net Core 应用程序警告安装 .Net Core,但它已安装

    我制作了一个 WPF 和控制台应用程序 供某人在我无法访问的私人服务器上使用 我使用 Visual Studio 2019 的内置 发布向导 来创建依赖于框架的单文件应用程序 当该人打开 WPF 应用程序时 他们会看到标准警告 他们单击 是
  • 模板外部链接?谁能解释一下吗?

    模板名称具有链接 3 5 非成员函数模板可以有内部链接 任何其他模板名称应具有外部链接 从具有内部链接的模板生成的实体与在其他翻译单元中生成的所有实体不同 我知道使用关键字的外部链接 extern C EX extern C templat
  • memcpy/memmove 到联合成员,这是否设置“活动”成员?

    重要说明 一些评论者似乎认为我是从工会抄袭的 仔细看memcpy 它从普通旧地址复制uint32 t 它不包含在联合中 另外 我正在复制 通过memcpy 到工会的特定成员 u a16 or u x in a union 不直接到整个联盟本
  • 如何在 C# 中创建异步方法?

    我读过的每一篇博客文章都会告诉您如何在 C 中使用异步方法 但由于某些奇怪的原因 从未解释如何构建您自己的异步方法来使用 所以我现在有这段代码使用我的方法 private async void button1 Click object se
  • 比较:接口方法、虚方法、抽象方法

    它们各自的优点和缺点是什么 接口方法 虚拟方法 抽象方法 什么时候应该选择什么 做出这一决定时应牢记哪些要点 虚拟和抽象几乎是一样的 虚方法在基类中有一个实现 可以选择重写 而抽象方法则没有 并且must在子类中被覆盖 否则它们是相同的 在
  • 模板类中的无效数据类型生成编译时错误?

    我正在使用 C 创建一个字符串类 我希望该类仅接受数据类型 char 和 wchar t 并且我希望编译器在编译时使用 error 捕获任何无效数据类型 我不喜欢使用assert 我怎样才能做到这一点 您可以使用静态断言 促进提供一个 ht
  • Visual Studio 2015 - Web 项目上缺少共享项目参考选项卡

    我从 MSDN 订阅升级到 Visual Studio 2015 因为我非常兴奋地阅读有关共享项目的信息 当我们想要做的只是重用代码时 不再需要在依赖项中管理 21382 个 nuget 包 所以我构建了一个测试共享项目 其中包含一些代码
  • 如何在 sql azure 上运行 aspnet_regsql? [复制]

    这个问题在这里已经有答案了 可能的重复 将 ASP NET 成员资格数据库迁移到 SQL Azure https stackoverflow com questions 10140774 migrating asp net membersh

随机推荐

  • 根据文件是否包含字符串进行搜索然后删除

    我想在单个目录中的多个文本文件中搜索字符串 monkey 如果该字符串存在 那么要么 取决于最简单的 重命名匹配的字符串 例如更改猴子monkey1并保存然后文件并进行搜索 处理 or 删除任何具有匹配字符串的文件 已经搜索过 但似乎找不到
  • 重定向 301 中的重定向过多

    我想从旧网址到新网址进行 301 重定向 旧网址 php zend framework captcha codigo anti spam zend framework 新网址 http www demo31 com blog php zen
  • 如何防止 Emacs org-mode 分割窗口?

    我是一个新的 emacs 用户 使用 emacs 来实现很棒的组织模式 我的页面顶部有指向所有组织文件的链接 但每次单击链接时 它都会分割我的窗口 因此我只有一半的屏幕空间可用 如何设置它以便 emacs 不会水平分割窗口 而是为我的链接打
  • 如何在swift 4中获取今天和明天的日期

    如何获取当前日期unix epoch timeIntervalSince1970打印当前时间 有什么办法可以获取今天中午 12 点的时间吗 例如 当前时间为 2018 年 1 月 7 日下午 5 30 timeIntervalSince19
  • 收到 pylint 警告:“未找到配置文件,使用默认配置”

    pylint reports n main py Output No config file found using default configuration 您将得到 No config file found using default
  • 如何将 foreach 与二维对象数组一起使用?

    这是我的尝试 但不起作用 我是初学者 这个想法是有一个简单的 Kid years 整数二维数组来了解如何将 foreach 与对象一起使用 using System namespace Test class Kid public int y
  • 禁用反应式 Elasticsearch 客户端

    我的 spring boot 版本 2 4 1 应用程序已使用自动连接的 org elasticsearch client RestHighLevelClient 成功连接到 ElasticSearch v7 9 3 实例 我只需指定应用程
  • ASM x64 scanf printf 双精度,GAS

    我不明白为什么这段代码对我不起作用 我需要对双精度使用 scanf 函数 然后对同一个双精度使用 printf 使用此代码时结果并不好 我看到的都是非常随机的角色 data d1 double format asciz lf n forma
  • 检测PHP是否安装了Mod_Security?

    有没有简单的方法可以仅使用 PHP 来检测 modsecurity 是否已安装并启用 理想情况下 无需执行任何 exec 终端类型命令 有些人建议使用 apache get modules 但这个特定的网络主机不允许它显示 其他用户也提到了
  • 如何获得 R 中前 n 个值及其索引?

    我有一个只有一列的数据框 我想用它的索引找到最大的三个值 例如我的数据框df好像 distance 1 1 2 4 3 2 4 3 5 4 6 5 7 5 我想找到最大的 3 个值及其索引 所以我的预期结果是 distance 6 5 7
  • 如何在本地调试EventHubTrigger?

    我正在尝试在本地调试 Azure 函数 这是一个EventHubTrigger 问题是我需要在本地调试代码 因为我仍然没有 真实 设置 我的代码目前如下所示 public static class Notificator FunctionN
  • 如何在 Spring Boot 中使用 Mapstruct 映射父级和子级?

    我有父级 产品 和子级 书籍 家具 并且希望将产品实体映射到产品 DTO 如您所见 产品被映射并存储在数据库中的单个表中 如何映射具有子项额外详细信息的父项产品 我看过this https stackoverflow com questio
  • 运行Qemu后只是黑屏

    我刚刚安装了 QEMU 并编译了支持 ARM 的 Linux 内核 但是当我运行下面的命令时 qemu system arm M versatilepb m 128M kernel home arit QEMU linux 3 8 4 ar
  • 在 RealityKit 中锚定多个场景

    将多个场景 来自 Reality Composer 加载到 arView 时 场景不会锚定在同一空间中 在此示例中 scene1 在应用程序启动时加载 按下按钮后 scene2就被添加到场景中 在这两个场景中 模型都放置在原点 并预计与添加
  • 无法在 WPF 中设置动画后的属性

    我使用以下代码为我的窗口设置动画 winLogin login new winLogin login Owner this login Show DoubleAnimation da new DoubleAnimation da From
  • 说服 Webpack 解释其“无法解析 'foo'” 错误

    我怎样才能说服Webpack 当它要发出时Can t resolve foo also 发出有关的信息它尝试过的地方 to find那个图书馆 错误信息Can t resolve foo 没有帮助 因为这是一条死胡同 读者不知道 Webpa
  • 仅使用 css/bootstrap 粘性多个表头 (thead) 行

    我试图在下面有多行 thead 标签被粘贴 而表格的其余部分是可滚动的 This https stackoverflow com questions 12266262 position sticky on thead 59690013 59
  • 按下主页按钮后如何在后台设置 CABasicAnimation 动画?

    我是ios开发的新手 我在我的项目中使用轮子图像 动画在前景模式下工作正常 之后我按下主页按钮 现在我重新启动应用程序 滚轮动画不起作用 这是我的代码 CABasicAnimation animation CABasicAnimation
  • 模块中子应用程序之间的 Angular2 路由

    我正在将 Angular 2 1 用于一个大型应用程序 该应用程序具有多个子模块 每个子模块定义按功能组织的子应用程序 顶层模块通过导入每个子应用程序的路由等 为 RouterModule 配置整个应用程序的所有子路由 因此 从子应用程序的
  • 如何在 LINQ to Entities 查询中实现查询拦截? (C#)

    我正在尝试在 EF4 中实现加密列 并使用 CTP5 功能来允许简单地使用 POCO 来查询数据库 抱歉 这是很多话 但我希望下面的内容足以解释需求和问题 那么 一些背景知识以及我迄今为止的进展 目的是 如果您在不使用我们的 DAL 的情况