1

我正在尝试转换此查询

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 并从数据库中获取池数据。

问题是 SOMETABLE 有大约 10 000 000 条记录并且它不能快速工作。

我做错了吗?

4

1 回答 1

7

您发布的代码至少有 3 个错误,所以我认为这不是您的实际代码。要获得您描述的症状,最可能的原因是您在某处使用过,并且正在IEnumerable<T>该处进行创作。要获得端到端查询组合(即在数据库中执行),您需要使用. 例如,以下内容已损坏:TOPIQueryable<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>过早地强迫它(或类似的,如列表)。

最后一点,如果您正在应用跳过/获取,IIRC 实体框架要求订购(如果您不应用则会出错) - 这进一步支持了我的猜测,即您已经IEnumerable<T>过早地下降,但是:如果您需要,请不要感到惊讶也指定一个order by

于 2012-04-25T08:53:54.720 回答