2016-06-22 6 views
5

Ich habe zwei Tabellen:Wie kann ich Objekte, die von EF zurückgegeben werden, nach einer ID-Liste sortieren?

User { 
    PK: UserId 
    ... 
} 

Product { 
    PK: ProductId, 
    FK: UserId 
    ... 
} 

ich eine Liste von ProductId s in zufälligem Format habe. Ich möchte das Ausgabeergebnis nicht sortieren und möchte auch Benutzerdaten für jede Produkt-ID hinzufügen.

Der folgende Code enthält die Daten im sortierten Format. Wie kann ich diese Sortierung vermeiden? Ich möchte, dass die Liste der Objekte in der gleichen Reihenfolge wie unsere Produktliste ist.

List<Tables.Product> tblProductList = 
    repo.Products 
     .Include("User") 
     .Where(x => productIdList.Contains(x.ProductId)) 
     .ToList(); 
+3

Es gibt nicht so etwas wie Standardsortierung . Wenn Sie keine OrderBy-Klausel angeben, gibt die Datenbank Objekte ohne Reihenfolge zurück. Sie * mögen * geordnet erscheinen, weil einige Operationen (zB Eindeutig) Sort verwenden. Selbst wenn die Abfrage teuer genug ist, um parallelisiert zu werden, werden auch diese ungeordnet sein. –

+0

Was ist 'productIdList'? Etwas von einer anderen Tabelle geladen oder nur eine Liste von IDs? –

+0

productIdList enthält eine Liste von Ganzzahl-IDs. –

Antwort

2

Ich möchte die Liste der Objekte in der gleichen Reihenfolge wie unsere Produktliste sein.

Ich gehe davon aus, indem unserer Produktliste Sie die productIdList Variable zur Filterung verwendet bedeuten.

Sie können das nicht in LINQ to Entities tun, also müssen Sie zu LINQ to Objects wechseln und die Reihenfolge im Speicher tun.

Eine Möglichkeit wäre IndexOf Methode zu verwenden:

var tblProductList = 
    repo.Products 
     .Include("User") 
     .Where(x => productIdList.Contains(x.ProductId)) 
     .AsEnumerable() // Switch to LINQ to Objects context 
     .OrderBy(x => productIdList.IndexOf(x.ProductId)) 
     .ToList(); 

Eine weitere leistungsfähigere Methode (wenn productIdList groß ist) könnte Zwischen Wörterbuch zu benutzen:

var productsById = 
    repo.Products 
     .Include("User") 
     .Where(x => productIdList.Contains(x.ProductId)) 
     .ToDictionary(x => x.ProductId); 

var tblProductList = productIdList 
    .Select(productId => productsById[productId]) 
    .ToList(); 
+0

Danke wie immer :) –

+0

Für 10 productIdList dauert die obige Abfrage 10 Sekunden. Gibt es eine Möglichkeit, es zu verbessern? –

+0

Wie lange dauert die ursprüngliche Abfrage? –

-1
var tblProductList=(from product in repo.Products 
        join user in repo.Users on product.UserId equals user.UserId 
        select new { Product=product,User=user}).toList(); 
+1

ORMs verwenden Relationen, keine Joins. Es gibt absolut keinen Grund, 'Join' zu verwenden, wenn die Beziehung bereits definiert ist. In der Tat ist es ein Fehler Joins zu verwenden, anstatt Beziehungen zuzuordnen –

Verwandte Themen