有没有办法使用LINQToSQL从表中返回一个随机行?
答案 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()