web-dev-qa-db-fra.com

EF Code First: comment obtenir des lignes aléatoires

Comment puis-je créer une requête dans laquelle je récupérerais des lignes aléatoires?

Si je devais l'écrire en SQL, je mettrais une commande sur on newid () et je couperais n nombre de lignes à partir du haut. Quoi qu'il en soit pour faire cela dans le code EF en premier?

J'ai essayé de créer une requête qui utilise newid () et de l'exécuter à l'aide de DbSet.SqlQuery (). pendant qu'il fonctionne, ce n'est pas la plus propre des solutions.

Aussi, a essayé de récupérer toutes les lignes et de les trier par un nouveau guid. Bien que le nombre de lignes soit assez petit, ce n'est toujours pas une bonne solution.

Des idées?

66
Mel

Il suffit d'appeler:

something.OrderBy(r => Guid.NewGuid()).Take(5)
140
SLaks

Comparaison de deux options:


Ignorer (nombre aléatoire de lignes)

Méthode

private T getRandomEntity<T>(IGenericRepository<T> repo) where T : EntityWithPk<Guid> {
    var skip = (int)(Rand.NextDouble() * repo.Items.Count());
    return repo.Items.OrderBy(o => o.ID).Skip(skip).Take(1).First();
}
  • Prend 2 requêtes

SQL généré

SELECT [GroupBy1].[A1] AS [C1]
FROM   (SELECT COUNT(1) AS [A1]
        FROM   [dbo].[People] AS [Extent1]) AS [GroupBy1];

SELECT TOP (1) [Extent1].[ID]            AS [ID],
               [Extent1].[Name]          AS [Name],
               [Extent1].[Age]           AS [Age],
               [Extent1].[FavoriteColor] AS [FavoriteColor]
FROM   (SELECT [Extent1].[ID]                                  AS [ID],
               [Extent1].[Name]                                AS [Name],
               [Extent1].[Age]                                 AS [Age],
               [Extent1].[FavoriteColor]                       AS [FavoriteColor],
               row_number() OVER (ORDER BY [Extent1].[ID] ASC) AS [row_number]
        FROM   [dbo].[People] AS [Extent1]) AS [Extent1]
WHERE  [Extent1].[row_number] > 15
ORDER  BY [Extent1].[ID] ASC;

Guid

Méthode

private T getRandomEntityInPlace<T>(IGenericRepository<T> repo) {
    return repo.Items.OrderBy(o => Guid.NewGuid()).First();
}

SQL généré

SELECT TOP (1) [Project1].[ID]            AS [ID],
               [Project1].[Name]          AS [Name],
               [Project1].[Age]           AS [Age],
               [Project1].[FavoriteColor] AS [FavoriteColor]
FROM   (SELECT NEWID()                   AS [C1],
               [Extent1].[ID]            AS [ID],
               [Extent1].[Name]          AS [Name],
               [Extent1].[Age]           AS [Age],
               [Extent1].[FavoriteColor] AS [FavoriteColor]
        FROM   [dbo].[People] AS [Extent1]) AS [Project1]
ORDER  BY [Project1].[C1] ASC
31
drzaus