Sql Linq存储库和GetTable()

Sql Linq存储库和GetTable(),sql,linq-to-sql,orm,lambda,lazy-loading,Sql,Linq To Sql,Orm,Lambda,Lazy Loading,我遵循相当标准的L2S存储库模式,使用以下方法之一 public IEnumerable<T> GetAllByFilter(Func<T, bool> expression) { return _dataContext.GetTable<T>().Where(expression); } 我有点恼火地看到,对GetTable的调用似乎真的得到了表,Where表达式可能随后在内存中进行了计算 一个简单的电话,比如 var order=GetAl

我遵循相当标准的L2S存储库模式,使用以下方法之一

public IEnumerable<T> GetAllByFilter(Func<T, bool> expression)
 {
     return _dataContext.GetTable<T>().Where(expression);
 }
我有点恼火地看到,对GetTable的调用似乎真的得到了表,Where表达式可能随后在内存中进行了计算

一个简单的电话,比如

var order=GetAllByFiltero=>o.OrderNumber==1

它应该只返回一条记录,正在获取整个50000条记录数据库

林克通常这么糟糕吗?还是我遗漏了什么

变化:

public IEnumerable<T> GetAllByFilter(Func<T, bool> expression)
{
    return _dataContext.GetTable<T>().Where(expression);
}
致:

这将使用可查询的SQL而不是可枚举的local,因此性能会更好。

更改:

public IEnumerable<T> GetAllByFilter(Func<T, bool> expression)
{
    return _dataContext.GetTable<T>().Where(expression);
}
致:


这将使用可查询(即SQL)而不是可枚举(即本地),因此性能会更好。

我认为这不会编译,所以只是一个输入错误?o、 OrderNumber=1我假设这不会编译,那么这只是一个输入错误?o、 订单号=1+1柯克。我经常看到这个问题;除了延迟执行的概念似乎并不广为人知之外,IEnumerable和IQueryable的扩展方法行为与表达式类型之间的差异似乎是许多人没有意识到的细微差别。谢谢!我试过IQueryable,但不知道你需要一个表达式参数。你有一个很好的链接来解释这一点吗?@fear,是的,当我第一次了解它的时候,这也让我很惊讶。不确定最方便的资源是什么,但如果您从未浏览过语言规范,那么它的可读性将远远超过您的预期。指向它的链接是:。相关部分为4.6表达式树类型。一本好的C类书籍,如《深度C》,也能很好地涵盖这一领域。+1柯克。我经常看到这个问题;除了延迟执行的概念似乎并不广为人知之外,IEnumerable和IQueryable的扩展方法行为与表达式类型之间的差异似乎是许多人没有意识到的细微差别。谢谢!我试过IQueryable,但不知道你需要一个表达式参数。你有一个很好的链接来解释这一点吗?@fear,是的,当我第一次了解它的时候,这也让我很惊讶。不确定最方便的资源是什么,但如果您从未浏览过语言规范,那么它的可读性将远远超过您的预期。指向它的链接是:。相关部分为4.6表达式树类型。一本像《深度C》这样的好的C语言书也能很好地涵盖这一领域。