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
Sql server 使用LINQ(ala TABLESAMPLE)从大型结果集中高效地选择随机行_Sql Server_Linq_Sql Server 2008_Random_Linq To Entities - Fatal编程技术网

Sql server 使用LINQ(ala TABLESAMPLE)从大型结果集中高效地选择随机行

Sql server 使用LINQ(ala TABLESAMPLE)从大型结果集中高效地选择随机行,sql-server,linq,sql-server-2008,random,linq-to-entities,Sql Server,Linq,Sql Server 2008,Random,Linq To Entities,我想从一个非常大的表(数百万行)上的复杂查询结果中选择一小部分随机行 我使用的是SQLServer2008,有效地实现这一点的正确方法似乎是使用子句 注1:我对流行的“orderbynewid()”解决方案不感兴趣-它对于大型表来说效率很低 注2:由于我的查询很复杂,如果可能的话,我不想首先计算它的计数 注3:由于resultset很大,我不想像建议的那样自己遍历它 关键是我用的是LINQ。具体来说,LINQ是一种实体 是否有一种LINQ友好的方式来使用TABLESAMPLE 即使没有直接的支持

我想从一个非常大的表(数百万行)上的复杂查询结果中选择一小部分随机行

我使用的是SQLServer2008,有效地实现这一点的正确方法似乎是使用子句

注1:我对流行的“orderbynewid()”解决方案不感兴趣-它对于大型表来说效率很低

注2:由于我的查询很复杂,如果可能的话,我不想首先计算它的计数

注3:由于resultset很大,我不想像建议的那样自己遍历它

关键是我用的是LINQ。具体来说,LINQ是一种实体

是否有一种LINQ友好的方式来使用TABLESAMPLE


即使没有直接的支持,是否有某种方法可以用LINQ编写大部分查询,然后执行少量手动SQL来执行TABLESAMPLE?

不是对您的问题的直接回答,但您可以使用此技术选择单个行的随机百分比样本。以下查询使用NEWID函数返回Sales.SalesOrderDetail表中大约百分之一的行:

SELECT * FROM Sales.SalesOrderDetail   
WHERE 0.01 >= CAST(CHECKSUM(NEWID(), SalesOrderID) & 0x7fffffff AS float) / CAST (0x7fffffff AS int)

可能感兴趣:

类似的东西应该可以工作(语法可能不完全正确,但您应该明白):


使用EF,您可以使用tablesample构造在模型中创建定义查询。看见或者,您可以在数据库中创建一个随机视图,然后将该视图包括在模型中。

我想实现的似乎一开始就不可能实现

TABLESAMPLE不能用于派生表,因此让一个复杂的查询生成一个大的结果集,然后使用TABLESAMPLE进行随机采样甚至是不可行的

TABLESAMPLE是在联接和soforth之前,只能在进入查询的基表上使用的东西。(见附件)

描述了一种有效获取随机百分比结果的方法,因此,大致实现我想要的效果的最佳方法可能是在视图中使用该结果,并根据该视图构建LINQ


谢谢大家的意见。

请注意,TABLESAMPLE不会提供真正的随机样本。@Mitch-Point Take。在这种情况下,准确的分布对我来说并不重要,只要它有点分散。有趣的问题。也许将标题改为“使用LINQ从一个非常大的表中选择随机行”是个好主意;我更新了标题。啊!!我知道您已经看到postAh yes似乎与此链接类似:如果您有一种以LINQ友好的方式实现这一点的方法,我也很想知道。这种方法有几个问题:(1)每个查询只获取一行[如果可能,我希望一次获取多行](2)在运行我的查询之前需要计算计数(复杂!)查询。我将更新该问题以注意该查询是复杂的。TABLESAMPLE不能用于视图定义中。对此有一个很好的评论线程,但该问题已被删除):(我的意思是答案已被删除:)@jwd感谢您的更正。定义查询仍然是可能的,因为它是纯SQL而不是保存的视图。
var rowCount = context.MyTable.Count();

int randomInt = new Random().Next(rowCount);    
var query = context.MyTable.Skip(randomInt).FirstOrDefault();