当我有条件(例如某些字段必须为真)时,使用Linq to SQL检索随机行的最佳(最快)方法是什么?
您可以通过使用伪造的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()。即
order by ctx.Random()
NEWID()
var cust = (from row in ctx.Customers where row.IsActive // your filter orderby ctx.Random() select row).FirstOrDefault();
请注意,这仅适用于中小型表;对于大型表,这将对服务器的性能产生影响,找到行数(Count),然后随机选择一个(),效率会更高Skip/First。
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