Linq zu Entitäten, zufällige Reihenfolge

c# entity-framework linq-to-entities

Frage

Wie gebe ich passende Objekte in zufälliger Reihenfolge zurück?
Um nur klar zu sein, das ist Entity Framework und LINQ to Entities.

(Luftcode)

IEnumerable<MyEntity> results = from en in context.MyEntity
                                where en.type == myTypeVar
                                orderby ?????
                                select en;

Vielen Dank

Bearbeiten:
Ich habe versucht, dies dem Kontext hinzuzufügen:

public Guid Random()
{
    return new Guid();
}

Und mit dieser Abfrage:

IEnumerable<MyEntity> results = from en in context.MyEntity
                                where en.type == myTypeVar
                                orderby context.Random()
                                select en;

Aber ich habe diesen Fehler bekommen:

System.NotSupportedException: LINQ to Entities does not recognize the method 'System.Guid Random()' method, and this method cannot be translated into a store expression..

Bearbeiten (aktueller Code):

IEnumerable<MyEntity> results = (from en in context.MyEntity
                                 where en.type == myTypeVar
                                 orderby context.Random()
                                 select en).AsEnumerable();

Akzeptierte Antwort

Die einfache Lösung wäre, ein Array (oder eine List<T> ) zu erstellen und dann seine Indizes zu randomisieren.

BEARBEITEN:

static IEnumerable<T> Randomize<T>(this IEnumerable<T> source) {
  var array = source.ToArray();
  // randomize indexes (several approaches are possible)
  return array;
}

EDIT: Ich persönlich finde die Antwort von Jon Skeet eleganter:

var results = from ... in ... where ... orderby Guid.NewGuid() select ...

Guid.NewGuid() können Sie auch einen Zufallszahlengenerator anstelle von Guid.NewGuid() .


Beliebte Antwort

Ein einfacher Weg, dies zu tun, ist die Bestellung durch Guid.NewGuid() aber dann erfolgt die Bestellung auf der Clientseite. Sie können EF vielleicht dazu bringen, zufällig auf dem Server etwas zufällig zu tun, aber das ist nicht unbedingt einfach - und die Verwendung von "Reihenfolge nach Zufallszahl" ist offensichtlich defekt .

Damit die Bestellung auf der .NET-Seite statt in EF ausgeführt wird, benötigen Sie AsEnumerable :

IEnumerable<MyEntity> results = context.MyEntity
                                       .Where(en => en.type == myTypeVar)
                                       .AsEnumerable()
                                       .OrderBy(en => context.Random());

Es wäre besser, die ungeordnete Version in eine Liste aufzunehmen und diese dann zu mischen.

Random rnd = ...; // Assume a suitable Random instance
List<MyEntity> results = context.MyEntity
                                .Where(en => en.type == myTypeVar)
                                .ToList();

results.Shuffle(rnd); // Assuming an extension method on List<T>

Das Mischen ist effizienter als das Sortieren, abgesehen von allem anderen. In meinem Artikel über Zufälligkeit finden Sie Details zum Erwerb einer geeigneten Random . Es gibt viele Fisher-Yates-Shuffle-Implementierungen für Stack Overflow.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum