获取LINQ to SQL的随机行

时间:2009-05-05 22:30:32

标签: .net linq linq-to-sql

有没有办法使用LINQToSQL从表中返回一个随机行?

6 个答案:

答案 0 :(得分:6)

是的,在表的计数范围内生成一个随机数,并跳过该数字,Take(1)然后返回结果序列的第一个元素。像

这样的东西
var R = new Random();
var ToSkip = R.Next(0, ctx.Customers.Count);

return ctx.Customers.Skip(ToSkip).Take(1).First();

但它有点难看。是否有实际要求要求在SQL表中获取随机行?

答案 1 :(得分:0)

您可以使用随机数和Skip()来到该行:

int randomNum = 10; // <-- determined by your favorite RNG
var row = mydb.Objects.Skip(randomNum).Take(1);

答案 2 :(得分:0)

从未尝试过,但我怀疑以下内容将完成工作

Random rnd = new Random();

int count = db.MyTable.Count();
int skip = rnd.Next(count);

var row = (from r in db.MyTable
           select r).Skip(skip).Take(1);

答案 3 :(得分:0)

我会尝试类似的事情:

query.Skip(rand.Next()).Take(1).FirstOrDefault();

rand初始化为返回特定范围之间的数字。

一定要检查null作为返回值,以防生成的随机数大于行数(当然你也可以将它的上限初始化为行数)。

答案 4 :(得分:0)

技术上:

var randomRow = (from rows in db.Table
  select shipper).First();

因为您无法确定行顺序,除非您指定order by子句。

答案 5 :(得分:0)

您可以让LinqToSQL生成使用SQL Server NEWID()函数的SQL。这是我的实施:

namespace Data    // change to whatever the namespace of your DataContext is, or remove
{
    /// <summary>
    /// Add RANDOM() extension to the Data context...
    /// </summary>
    partial class DefaultDataContext  // change to the name of your DataContext
    {
        [System.Data.Linq.Mapping.Function(Name = "NEWID", IsComposable = true)]
        public Guid Random()
        {
            // this code is not actually executed, it simply provides a way to access 
            // T-SQL "NEWID()" function from Linq to SQL
            throw new NotImplementedException();
        }
    }
}

从数据库中提取随机产品的用法示例:

var product = (from p in db.Products     // our DataContext instance is called db here
               orderby db.Random()
               select p).FirstOrDefault()