通过linq2sql选择n个随机行

时间:2010-03-03 06:08:16

标签: c# linq-to-sql random

我知道使用

ORDER BY NEWID()
运行常规sql命令时的

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

我更喜欢来选择整个范围,通过rnd.Next()添加一个随机数,然后排序......

2 个答案:

答案 0 :(得分: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
    {
    }
}

答案 1 :(得分:2)

尝试Take扩展方法:

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

我们在这里做的是:

  1. 按ASC顺序按NewId字段排序。
  2. 选择N第一行,其中N是随机数。
  3. 如果您希望订单是随机的,请尝试以下操作:

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

    我们在这里做的是:

    1. 以随机顺序排列列表。
    2. 排在前20行。