LINQ 与 sql - 返回太多行

本文关键字:太多 返回 sql LINQ | 更新日期: 2023-09-27 18:32:07

>我正在尝试转换此查询

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 条记录,并且它不能快速工作。

我做错了吗?

LINQ 与 sql - 返回太多行

您发布的代码至少有 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,请不要感到惊讶。