C# 使用Linq选择前100条记录
如何使用Linq返回前100条记录 我有一张有四千万张唱片的桌子 此代码可以工作,但速度较慢,因为它将在筛选之前返回所有值:C# 使用Linq选择前100条记录,c#,linq,C#,Linq,如何使用Linq返回前100条记录 我有一张有四千万张唱片的桌子 此代码可以工作,但速度较慢,因为它将在筛选之前返回所有值: var values = (from e in dataContext.table_sample where e.x == 1 select e) .Take(100); 有没有办法返回已过滤的?与T-SQL TOP子句类似?否,在筛选之前不会返回所有值。Take(100)最终将成为发送的
var values = (from e in dataContext.table_sample
where e.x == 1
select e)
.Take(100);
有没有办法返回已过滤的?与T-SQL TOP子句类似?否,在筛选之前不会返回所有值。
Take(100)
最终将成为发送的SQL的一部分-很可能使用TOP
当然,当您指定了一个orderby
子句时,这样做更有意义
LINQ在到达查询表达式末尾时不执行查询。它仅在您调用聚合运算符(例如,Count
或any
)或开始迭代结果时发送任何SQL。甚至调用Take
实际上也不会执行查询-例如,您可能希望在之后对其进行更多筛选,这可能最终成为查询的一部分
当您开始迭代结果时(通常是使用foreach
)-此时SQL将实际发送到数据库
(顺便说一句,我认为你的
where
子句有点破绽。如果你的真实代码有问题,那么尽可能接近真实代码会有帮助。)我认为你在进入前100名之前返回所有记录的说法是不对的。我认为Linq决定了在执行查询时SQL字符串是什么(也称为延迟加载),您的数据库服务器将对其进行优化。您是否将标准SQL查询与Linq查询进行了比较?哪一个更快,差异有多大
我同意上面的评论,即您的linq查询通常是正确的,但是
- 在您的'where'子句中,可能应该是x==1而不是x=1(比较而不是赋值)
- “select e”将返回您可能只需要其中一些列的所有列-使用select子句(仅键入必填列)更精确;'select*”是大量的资源
- 确保您的数据库索引良好,并尝试使用索引数据
无论如何,4000万条记录的数据库是相当庞大的——你们需要所有这些数据吗?也许某种分区可以将它简化为最常用的记录。我要冒险一试,猜想where子句中使用的列没有索引。如果是这样的话,那么当查询被具体化时,它无疑是在进行表扫描,这就是它花费如此长时间的原因。我同意Jon Skeet的观点,但只是想补充一下:
不完全是-我想你的意思是“where e.x==1”,我认为dataContext.table_sample.where(e=>e.x==1.Take)(100)更容易阅读mantain。SampleTable似乎比table_sample更好。在DataClassesDataContext设计器(.dbml)中,您还可以指定检索哪些列。默认情况下,检索所有列(在SQL中选择*)。只需单击某个字段并查看其属性即可对其进行更改。