Récupération aléatoire efficace des lignes de données dans des conditions Linq to SQL
L'utilisation de Linq to SQL pour interroger la base de données est une méthode puissante pour récupérer les données d'une base de données relationnelle. Cependant, la sélection de lignes aléatoires tout en appliquant des conditions spécifiques présente certains défis. Cet article explore une solution efficace à ce problème.
Utiliser des fonctions définies par l'utilisateur simulées (UDF)
Linq to SQL n'a aucun moyen direct de sélectionner des lignes aléatoires. Pour surmonter cette limitation, une UDF fictive peut être créée dans la base de données. Ceci peut être réalisé en ajoutant une méthode à la classe de contexte de données partielles comme suit :
<code class="language-csharp">partial class MyDataContext { [Function(Name="NEWID", IsComposable=true)] public Guid Random() { // 证明我们的C#代码未使用... throw new NotImplementedException(); } }</code>
Cet UDF agit comme un espace réservé pour permettre un classement aléatoire dans SQL Server.
Appliquer un ordre aléatoire
Une fois l'UDF fictif en place, la requête LINQ peut être triée en appelant la méthode ctx.Random()
. Cela demandera à la base de données d'effectuer un tri aléatoire à l'aide de la fonction NEWID()
.
<code class="language-csharp">var cust = (from row in ctx.Customers where row.IsActive // 你的筛选条件 orderby ctx.Random() select row).FirstOrDefault();</code>
Cette requête récupérera une seule ligne aléatoire qui répond aux critères spécifiés.
Notes de performances
Il convient de noter que l'utilisation de cette méthode UDF peut affecter les performances des grandes tables. Dans ce cas, une approche plus efficace consiste à déterminer le nombre de lignes (à l'aide de la méthode Count()
), à générer un index aléatoire, puis à récupérer les lignes aléatoires à l'aide des méthodes Skip()
et FirstOrDefault()
.
Méthode basée sur le comptage
<code class="language-csharp">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(); // 第二次往返数据库</code>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!