LINQ vs sql - 带回太多行

时间:2012-04-25 08:48:49

标签: c# asp.net-mvc linq entity-framework

我正在尝试转换此查询

select top(10) *
from SOMETABLE
where Name = 'test'

进入linq所以我觉得它应该是这样的

  var c =
  (from l
  in db.SOMETABLE
  where l.Name= 'test'
  select l).take(10);

但是当我查看服务器分析器时,我可以看到linq从表中获取所有数据,并且可能应用WHERE和TAKE从数据库中汇集数据。

问题在于SOMETABLE有大约10 000 000条记录,并且无法快速运行。

我做错了吗?

1 个答案:

答案 0 :(得分:7)

您发布的代码至少有3个错误,因此我认为它不是您的实际代码。要获得您描述的症状,最可能的原因是您在某处使用过IEnumerable<T>,并且正在从<组成。要获得端到端查询组合(即在数据库中执行TOP),您需要使用IQueryable<T>。例如,以下内容已被破坏:

IEnumerable<SomeType> data = db.SomeTable;

var c = (from l in data
         where l.Name == "test"
         select l).Take(10);

但是以下内容绝对没问题,注意到只有第一行发生了变化:

IQueryable<SomeType> data = db.SomeTable;

var c = (from l in data
         where l.Name == "test"
         select l).Take(10);

注意到这也与:

相同
IQueryable<SomeType> data = db.SomeTable;

var c = data.Where(l => l.Name == "test").Take(10);

所以:确保你没有过早地强迫它IEnumerable<T>(或类似的,如列表)。

作为最后一点,如果您正在应用skip / take,则IIRC实体框架需要订购(如果您不应用,则会出错) - 这进一步支持了我的猜测,即您已过早地降至IEnumerable<T>,但是:如果您还需要指定order by,请不要惊讶。