【发布时间】:2011-11-04 21:39:42
【问题描述】:
我的问题是,当您在制作自己的 IQueryable 实现时,如何/何时重载(如果可能的话?) IQueryable 的 Where() extension 方法?
例如,在实体框架中,我的理解是对 ObjectSet 进行的 Where() 调用将更改传递给数据库的实际 SQL。或者,如果您首先转换为 IEnumerable(),则过滤是使用 LINQ-To-Objects 而不是 LINQ-To-Entities 完成的。
例如:
new MyDBEntities().MyDbTable.Where(x => x.SomeProperty == "SomeValue");
// this is linq-to-entities and changes the database-level SQL
对比:
new MyDBEntities().MyDbTable.AsEnumerable().Where(x => x.SomeProperty == "SomeValue");
// this is linq-to-objects and filters the IEnumerable
在实现自己的 IQueryable 并且 IQueryable 已经具有预定义的扩展方法(例如 Where())时,您如何处理这个问题?具体来说,我想制作自己的非常简单的 ORM,它在后台使用原生 SQL 和 SqlDataReader,并希望有一个 .Where() 方法在将原生 SQL 传递到数据库之前对其进行更改。
我应该使用 IQueryable 还是完全创建自己的类?我希望能够使用 lambda 语法并根据用于过滤的 lambda 函数更改我的 SQL 命令。
【问题讨论】:
-
我不确定这是否有帮助,但你可能想至少阅读一下 relinq:relinq.codeplex.com 他们可能已经完成了一些你正在寻找的东西(它是开源的) .或者可能根本没有重叠。
标签: c# linq entity-framework orm linq-to-entities