2015-09-02 11 views
6

Devo selezionare 1000 record distinti usando LINQ. Ma quando vedo la query generata ci vogliono 1000 record e si applica distinti rispetto a quel risultato.Query linq Take() ha la precedenza su Distinct()?

IQueryable<TestClass> resultSet = (from w in ......).Distinct().Take(1000); 

dove la mia TestClass sarebbe come,

public TestClass 
{ 
public string TestPRop { get; set; } 
//..has some 20 properties 
} 

Qualsiasi modo per risolvere questo per ottenere distinte applicata per il gruppo di risultati e poi prendere 1000 dal risultato distinta set?

+0

Hai provato ad aggiungere "Salta (0)'? Forse questo creerà una query "offset fetch next" e non una top n. –

+2

Hai provato a utilizzare un operatore di gruppo invece che distinto per vedere se questo influenza l'ordine delle operazioni? –

+1

Prova 'var subquery = (da w in ...). Distinct();' e quindi 'result = (da s in sottoquery dove 1 == 1 seleziona s) .Take (1000);'. per vedere se questo costringe il distinto a far parte di una subquery. – juharr

risposta

0

Si stanno prendendo solo 1000 record e quindi si applica distinto su quei 1000 record con il proprio codice anche se si sta facendo distinto() prima di Take().

Il modo migliore per raggiungere questo obiettivo è quello di ottenere i 1000 record distinti direttamente dalla query SQL piuttosto che dal codice di IE

string queryString = "SELECT top 1000 from (select distinct ... from table)"; 
+0

'Stai solo acquisendo 1000 record e poi applicando distinti su quei 1000 record' - a cosa stai basando questo? Non è così che leggo la domanda. –

+0

Kirk, il punto del mio post è quello di utilizzare la query sql per ottenere i dati – Jack89515

-1

è possibile utilizzare LINQ nidificato interroga

IQueryable<TestClass> resultSet = from x in ((from w in ......).Distinct()).Take(1000); 
+2

che non cambierà in alcun modo la query generata. Questo verrà compilato fino a un albero di espressioni identico prima che raggiunga anche il provider di query. – Servy

1

volontà Distinto essere elaborato prima del take. Controlla che il tuo Distinct funzioni correttamente. Ecco un esempio funzionante:

var dataset = new int[] 
{ 
    1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10 
}; 

var query = from o in dataset select o; 
var result = query.Distinct().Take(6); 

// result = `1,2,3,4,5,6` 

Sospetto che il problema riguardi l'utilizzo distinto con SQL. In questo caso, puoi anche utilizzare il raggruppamento per ottenere il risultato desiderato.

var distinctById = from o in query 
        group o by o.Id into uniqueIds 
        select uniqueIds.FirstOrDefault(); 
+0

funziona perché hai una lista di int. Non funzionerà quando si ha una lista di T (T è una classe). – Arvind897

+2

@ Arvind897 funzionerà sicuramente quando 'T' è una classe. –

+0

@JonHanna nopes .. quello che fa è che ci vogliono 1000 record e poi ne distingue .. Quando lo si interroga sul DB. – Arvind897

Problemi correlati