一尘不染

从Linq到Sql的随机行

c#

当我有条件(例如某些字段必须为真)时,使用Linq to SQL检索随机行的最佳(最快)方法是什么?


阅读 200

收藏
2020-05-19

共1个答案

一尘不染

您可以通过使用伪造的UDF在数据库上执行此操作;在部分类中,向数据上下文添加一个方法:

partial class MyDataContext {
     [Function(Name="NEWID", IsComposable=true)] 
     public Guid Random() 
     { // to prove not used by our C# code... 
         throw new NotImplementedException(); 
     }
}

然后就order by ctx.Random(); 这将根据进行SQL Server的随机排序NEWID()。即

var cust = (from row in ctx.Customers
           where row.IsActive // your filter
           orderby ctx.Random()
           select row).FirstOrDefault();

请注意,这仅适用于中小型表;对于大型表,这将对服务器的性能产生影响,找到行数(Count),然后随机选择一个(),效率会更高Skip/First


对于计数方法:

var qry = from row in ctx.Customers
          where row.IsActive
          select row;

int count = qry.Count(); // 1st round-trip
int index = new Random().Next(count);

Customer cust = qry.Skip(index).FirstOrDefault(); // 2nd round-trip
2020-05-19