2009-12-14 14 views
22

Jeśli otrzymam dwa wyniki IQueryable z różnych linery Query i chcę je połączyć i zwrócić jeden w wyniku, jak to zrobić? Na przykład, jeżeli:Jak połączyć wynik IQueryable <T> razem?

var q1 = (IQueryable<Person>).....; 
var q2 = (IQueryable<Person>).....; 

jak połączyć Q1 i Q2 razem i uzyskać wynik jak

var q = (IQueryable<Person>)q1.Union(q2); 

Odpowiedz

24

Trzeba go q1.Union(q2). Numer Union znajduje się w przestrzeni nazw System.Linq z funkcją Queryable.

+3

Popraw mnie jeśli się mylę, ale IMO w tym roztworze należy wziąć pod uwagę, że parametr unia jest IEnumerable, więc nie zrobi Unii w bazie danych. Ponadto wywoła on dwa razy w bazie danych, ponieważ parametr jest IEnumerable i chociaż jedno przejście IQueryable zostanie wykonane jako kolejne wywołanie do bazy danych. Chciałem tylko wskazać, czy wydajność jest problemem w unii pamięci, czy w wywołaniach do bazy – fmaccaroni

+1

@fmaccaroni Przyszedłem do tego pytania, ponieważ pomyślałem dokładnie to samo. Następnie zrobiłem szybki test w LINQPad 5, który * powinien * używać LINQ-SQL. 'q1.Union (q2)' produkuje 'SELECT * FROM (SELECT * FROM q1 UNION SELECT * FROM q2)'. Tak więc LINQ rzuca parametr 'IEnumerable' z powrotem do' IQueryable' gdzieś pod okładkami. –

15

Możesz spróbować metody Concat

coś takiego

int[] i1 = new int[] { 1, 2, 3 }; 
int[] i2 = new int[] { 3, 4 }; 
//returns 5 values 
var i3 = i1.AsQueryable().Concat(i2.AsQueryable()); 
//returns 4 values 
var i4 = i1.AsQueryable().Union(i2.AsQueryable()); 

Unii tylko daje odrębnych wartości Concat daje UNION ALL.

+4

Unia użyje domyślnego porównywalnika, jeśli nie określi jednego, każda osoba będzie prawdopodobnie miała inne odniesienie do obiektu. –

2
(q1.Union(q2)).AsQuerable() 
+1

Metoda unijna zwraca właściwość Queryable. –

+0

Konkurs może być bardziej odpowiedni – kerem

2

Z NHibernate Union nie jest możliwe.

Musisz przetwarzać po stronie klienta zamiast DB przetwarzanie związku. Konwertuję IQueryable na IENumerable z AsEnumerable, a następnie używam rozszerzenia Concat.

var allItems = q1.AsEnumerable(). Concat (Q2)

Pozdrowienia, Sebastian

Powiązane problemy