Linq to SQL 条件下でのデータ行の効率的なランダム取得
Linq to SQL を使用してデータベースにクエリを実行することは、リレーショナル データベース データを取得するための強力な方法です。ただし、特定の条件を適用しながらランダムな行を選択すると、いくつかの課題が生じます。この記事では、この問題に対する効率的な解決策を検討します。
シミュレートされたユーザー定義関数 (UDF) を使用する
Linq to SQL には、ランダムな行を直接選択する方法がありません。この制限を克服するために、データベース内にモック UDF を作成できます。これは、次のように部分データ コンテキスト クラスにメソッドを追加することで実現できます:
partial class MyDataContext { [Function(Name="NEWID", IsComposable=true)] public Guid Random() { // 证明我们的C#代码未使用... throw new NotImplementedException(); } }
この UDF は、SQL Server でランダムな順序付けを可能にするプレースホルダーとして機能します。
ランダムな順序を適用します
モック UDF を配置したら、ctx.Random()
メソッドを呼び出して LINQ クエリを並べ替えることができます。これにより、NEWID()
関数を使用してランダムな並べ替えを実行するようにデータベースに指示されます。
var cust = (from row in ctx.Customers where row.IsActive // 你的筛选条件 orderby ctx.Random() select row).FirstOrDefault();
このクエリは、指定された基準を満たす 1 つのランダムな行を取得します。
パフォーマンスノート
この UDF メソッドを使用すると、大きなテーブルのパフォーマンスに影響を与える可能性があることに注意してください。この場合、より効率的なアプローチは、(Count()
メソッドを使用して) 行数を決定し、ランダムなインデックスを生成し、Skip()
メソッドと FirstOrDefault()
メソッドを使用してランダムな行を取得することです。
カウントベースのメソッド
var qry = from row in ctx.Customers where row.IsActive select row; int count = qry.Count(); // 第一次往返数据库 int index = new Random().Next(count); Customer cust = qry.Skip(index).FirstOrDefault(); // 第二次往返数据库
以上がLinq to SQL を使用して条件付きでランダムな行を効率的に取得する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。