2010-03-03 36 views
5

选择n个随机行我知道运行常规的SQL命令时,使用通过LINQ2SQL

ORDER BY NEWID() 

功能。我想要做同样的事情,但通过linq2sql。

我宁愿不选择整个范围内,通过rnd.Next添加一个随机数(),然后进行排序,最后...

回答

3

Marc Gravell发布了一个solution here,它允许您定义一个在DataContext的分部类中使用NEWID的函数。不要将其放置在生成的DataContext类中,否则将来的更新会消除您添加的内容。

Marc展示了如何在查询表达式语法中使用它。或者,使用点符号,可以这样写:

var results = dc.Table.OrderBy(r => dc.Random()).Take(n); 

如果您不熟悉创建部分类,只需向解决方案中添加一个新类即可。只要类定义使用带有partial关键字的DataContext类名称,它的名称就无关紧要。例如,如果你的DataContext被命名为XYZDataContext您可以添加一个名为XYZDataContextPartial.cs新类,并把它定义为:

namespace YourNamespace 
{ 
    public partial class XYZDataContext 
    { 
    } 
} 
+0

完美!马克的解决方案完全按照我的意愿工作。 – benpage 2010-03-03 22:45:29

2

尝试Take扩展方法:

.OrderBy(x=>x.NewId) 
.Take(randomNumber); 

我们在这里所做的是:在ASC为了

  1. 排序NEWID场。
  2. 选择第N行,其中N是随机数。

如果您希望为了是随机的,试试这个:

.OrderBy(x => Guid.NewGuid()) 
.Take(20); 

我们在这里所做的是:

  1. 订单列表按随机顺序。
  2. 取前20行。