2011-07-26 7 views
5

Tworzę formularz generyczny (C#), który może odbierać dowolne zapytanie Linq. W tej formie chcę móc dodawać filtry (klauzule WHERE). W przypadku operatorów takich jak "=", ">", "Lubię to" itp., Mogę robić rzeczy takie jak IQueryable.Where(someFieldname + "> @0", someCriteria). Ale kiedy chcę móc wykonać ekwiwalent T-sql "IN", jestem całkowicie zagubiony. Szukałem godzin, ale nie mogę znaleźć sposobu, aby to zrozumieć.Jak zrealizować ekwiwalent tsql "IN" przy użyciu dynamq Linq

Myślenie o tym w sposób, który powinien być możliwy, polega na umieszczeniu wartości w klauzuli IN w tablicy łańcuchowej lub na innej prostej liście łańcuchów. Następnie dołącz do tej listy za pomocą zapytania podstawowego. Ale jak mogę dołączyć do tych dwóch, gdy zapytanie bazowe może być dowolnym zapytaniem?

przykład: że moje żądania podstawowego jest czymś:

IQueryable<Object> q = from a in db.Adresses 
         select new { a.Street, a.HouseNr }; 

w postaci I chcą mieć możliwość filtrowania HouseNr następująco: gdzie HouseNr (w 1, 3, 5) Liczby (1, 3, 5) są dostępne w tablicy łańcuchów (lub dowolnej innej liście łańcuchów).

Jak mogę to osiągnąć, wiedząc, że podstawowym zapytaniem może być cokolwiek?

+0

Nie sądzę, aby jedna osoba rozumiała Twoje pytanie. Możesz użyć Dynamic Linq do wygenerowania listy instrukcji 'OR', ale to nie jest * dokładnie * to samo, co klauzula' IN'. –

Odpowiedz

4
int[] list = new[]{1, 3, 5}; 
IQueryable<Object> q = from a in db.Adresses 
         where list.Contains(a.HouseNr) 
         select new { a.Street, a.HouseNr }; 
+0

Działa to, gdy masz obiekt o nazwie Adresy, ale to, co mam, to zapytanie, które może być wszystkim. Potrzebuję dynamicznego rozwiązania, a nie rozwiązania, w którym na stałe odwołuję się do obiektów Linq. –

+0

@Stefan można nadal używać Contains() w dynamicznych wynikach zapytania w ten sam sposób. –

+1

Czy możesz dać mi przykład tego? Po prostu nie mogę tego zrozumieć. –

2

Contains mapy do IN gdy SQL jest generowany.

int[] numbers = new int[] { 1, 3, 5 }; 

var q = from a in db.Addresses 
     where numbers.Contains(a.HouseNr) 
     select new { a.Street, a.HouseNr } 
+1

Niestety nie jest to rozwiązanie mojego problemu. Użyłem adresów jako przykładu. Zastąp adresy przez dowolny obiekt IQueryable: jakie byłoby twoje rozwiązanie? –

0

Jak o tak ...

string[] Numbers = new string[]{"1", "3", "5"}; 
IQueryable<Object> q = db.Adresses.Where(a => Numbers.Contains(h.HouseNr)); 
0

Tylko że ... nie sposób .Intersect() powrócić wartości listy gdzie istnieją wartości w obu?