Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Linq选择前100条记录_C#_Linq - Fatal编程技术网

C# 使用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)最终将成为发送的

如何使用Linq返回前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的观点,但只是想补充一下:

  • 生成的SQL将使用TOP实现Take()

  • 如果您能够在调试模式下运行SQL Profiler并逐步完成代码,您将能够准确地看到生成了什么SQL以及何时执行。如果你有时间这样做,你会学到很多关于下面发生的事情

  • 还有一个DataContext.Log属性,您可以指定TextWriter来查看生成的SQL,例如:

    dbContext.Log=Console.Out

  • 另一个选择是试验。LINQPad允许您连接到数据源并轻松尝试不同的LINQ表达式。在“结果”面板中,可以切换以查看由LINQ表达式生成的SQL


  • 不完全是-我想你的意思是“where e.x==1”,我认为dataContext.table_sample.where(e=>e.x==1.Take)(100)更容易阅读mantain。SampleTable似乎比table_sample更好。在DataClassesDataContext设计器(.dbml)中,您还可以指定检索哪些列。默认情况下,检索所有列(在SQL中选择*)。只需单击某个字段并查看其属性即可对其进行更改。