spd*_*dro 1 c# linq asp.net-mvc entity-framework
我正在尝试转换此查询
select top(10) *
from SOMETABLE
where Name = 'test'
Run Code Online (Sandbox Code Playgroud)
进入linq所以我认为它应该是这样的
var c =
(from l
in db.SOMETABLE
where l.Name= 'test'
select l).take(10);
Run Code Online (Sandbox Code Playgroud)
但是当我查看服务器分析器时,我可以看到linq从表中获取所有数据,并且可能应用WHERE和TAKE从数据库汇集数据.
问题是SOMETABLE有大约10 000 000条记录,并且不能快速运行.
我做错了吗?
您发布的代码至少有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);
Run Code Online (Sandbox Code Playgroud)
但以下是绝对正常的,并指出只有第一行发生了变化:
IQueryable<SomeType> data = db.SomeTable;
var c = (from l in data
where l.Name == "test"
select l).Take(10);
Run Code Online (Sandbox Code Playgroud)
注意到这也与:
IQueryable<SomeType> data = db.SomeTable;
var c = data.Where(l => l.Name == "test").Take(10);
Run Code Online (Sandbox Code Playgroud)
所以:确保你没有IEnumerable<T>过早地强迫它(或类似的,如列表).
作为最后一点,如果您正在应用skip/take,则IIRC实体框架需要订购(如果您不这样做则会出错) - 这进一步支持了我的猜测,您已经IEnumerable<T>太早了,但是:如果您需要,请不要惊讶也指定一个order by.
| 归档时间: |
|
| 查看次数: |
325 次 |
| 最近记录: |