2016-06-22 12 views
5

ho due tabelle:Come posso ordinare gli oggetti restituiti da EF in base a un elenco di ID?

User { 
    PK: UserId 
    ... 
} 

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

Ho una lista di ProductId s in formato casuale. Non voglio ordinare il risultato di output e vorrei includere anche i dati dell'utente per ogni ID prodotto.

Il codice seguente fornisce i dati in formato ordinato. Come posso evitare questo ordinamento? Voglio che l'elenco degli oggetti sia nello stesso ordine del nostro elenco di prodotti.

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

Non esiste una cosa come impostazione predefinita l'ordinamento . A meno che non si specifichi una clausola OrderBy, il database restituirà oggetti senza ordinare. Possono * apparire * ordinati perché alcune operazioni (ad esempio Distinte) utilizzano Ordina. Anche questi non saranno ordinati se la query è abbastanza costosa da essere parallelizzata –

+0

Che cos'è 'productIdList'? Qualcosa caricato da un'altra tabella o solo una lista di ID? –

+0

productIdList contiene un elenco di ID interi. –

risposta

2

voglio l'elenco di oggetti di essere nello stesso ordine come la nostra lista dei prodotti.

presumo da nostra lista prodotti si intende la variabile productIdList utilizzato per il filtraggio.

Non è possibile farlo in LINQ alle entità, quindi è necessario passare a LINQ su Oggetti ed eseguire l'ordine in memoria.

Un modo potrebbe essere quello di utilizzare IndexOf metodo:

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(); 

Un altro metodo più performante (quando productIdList è grande) potrebbe essere quella di utilizzare il dizionario intermedia:

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

Grazie come sempre :) –

+0

Per 10 IDProdottoLa query di cui sopra impiega 10 secondi. C'è un modo per migliorarlo? –

+0

Quanto ci vuole per la query originale? –

-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

Gli ORM usano le relazioni, non i join. Non c'è assolutamente alcun motivo per usare 'join' quando la relazione è già definita. In effetti, è un bug usare i join invece di mappare le relazioni –

Problemi correlati