1. ホーム
  2. c#

[解決済み] LinqからSqlへのランダム行

2022-05-15 19:12:54

質問

Linq to SQLを使用して、あるフィールドがtrueでなければならないなどの条件があるときに、ランダムな行を取得するための最良の(そして最も速い)方法は何でしょうか?

どのように解決するのですか?

データベースで、偽の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() のおかげで SQL-Server でランダムな順序になります。

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