一些背景信息和我的进展情况:
目的是如果您在不使用我们的数据访问层的情况下查询表格,则数据是垃圾的,但我不希望开发人员担心数据何时如何加密。
为了简化起见,在这个阶段,我假设任何字符串列都将被加密。
现在,我已经成功地实现了使用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
的实例传递给 Things.Add()
(在名称和/或OtherString值中具有清晰的字符串数据)
然后调用myDbContext.SaveChanges()
在到达数据存储之前加密字符串。
现在,我遇到的问题是在这个查询中:
var things = from t in myDbContext.Things
where t.Name == "Hairbrush"
select t;
这将导致在数据库中将未加密值与加密值进行比较。显然,我不想从数据库中获取所有记录,将它们实例化,然后根据提供的任何 Where 子句过滤结果...所以我需要做的是:拦截该查询并通过加密 Where 子句中的任何字符串来重写它。 所以我看了一下:
- 编写一个查询提供程序,但那似乎不是正确的解决方案...(是吗?)
- 为 DbSet 编写自己的 IQueryable 包装器,该包装器将捕获表达式,使用表达式树访问器对其进行操作,然后将新表达式转发到 DbSet...
我主要遇到的问题是 LINQ 表达式何时/如何应用于对象...我想我已经有点混淆了表达式何时在 IQueryable 对象中执行,因此我不确定我需要在我的包装器中实现哪个方法来获取和操纵传递的表达式...
我相信我在这里肯定缺少了一些非常明显的东西,正在等待那个灯泡时刻...但它还没有到来!!
非常感谢您提供的任何帮助!