【问题标题】:Overloading .Where extension with IQueryable<T> implementation使用 IQueryable<T> 实现重载 .Where 扩展
【发布时间】: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


【解决方案1】:

可以创建类似于IQueryable&lt;T&gt; 的自己的类型,但这可能不是一个好主意。您可能应该编写自己的接口实现。 There is a nice series of articles on how to do it,但要做好准备,这样做并不是一件容易的事。

【讨论】:

  • 如果您推出自己的 IQueryable 实现并完成所有表达式访问者工作,您会自动获得自定义 .Where() 扩展方法,还是必须编写自己的 .Where () 针对从 IQueryable 派生的新类型的扩展方法,即 public static MyQueryableImpl Where(this MyQueryableImpl, Func filter)..
  • 如果您这样做,Queryable.Where() 方法将满足您的需求。这就是它的用途。所以,不,你不需要实现你自己的Where(),但是你需要编写代码来翻译包含对Where()的调用的表达式来纠正SQL。
猜你喜欢
  • 1970-01-01
  • 2016-02-14
  • 2019-10-23
  • 1970-01-01
  • 2010-10-30
  • 2011-10-09
  • 1970-01-01
  • 2010-10-26
  • 1970-01-01
相关资源
最近更新 更多