100 votes

EF Premier Code: Comment obtenir des lignes aléatoires

Comment puis-je construire une requête où je voudrais récupérer les lignes aléatoires?

Si je devais l'écrire en SQL, puis je voudrais mettre un order by sur newid() et coupez-n nombre de lignes à partir du haut. De toute façon pour ce faire, en EF premier code?

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

Aussi, essayé de récupérer toutes les lignes et en les triant par un nouveau guid. Bien que le nombre de lignes sont assez petits, ce n'est pas une bonne solution.

Des idées?

196voto

SLaks Points 391154

Appelez simplement:

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

48voto

drzaus Points 3344

La comparaison de deux options:


Skip(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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X