Mam następujący problem.
Mam tabelę w MsSQL : samochody -> int id , string nazwa, string marka
Chcę zrobić wyszukiwarkę po marce oraz nazwie tzn gdy użytkownik wpisze nazwe lub/i markę to wyszuka mi samochody spełniące podane warunki.
Zrobiłem to w za pomocą SQLa ale teraz chcę napisać to zapytanie w LINQ.
Normalnie metoda by wyglądała tak:
string warunek = "WHERE "
if(uzytkownikPodalNazwe)
{
warunek += " nazwa= " + podanaNazwa;
}
if(uzytkownikPodalMarke)
{
warunek += " marka = " + podanaMarka;
}
Wtedy zapytanie wygląda
"SELECT nazwa, marka FROM samochody " + warunek;
W Powyższym przykładzie pominąłem kilka rzeczy które jeszcze trzeba by sprawdzić ( np usunąć where jeśli nie podał ani marki ani nazwy ) ale ogólna idea jest taka, że tworzymy warunek do zapytania w locie w zależności od tego co podał użytkownik. Wtedy wygenerowany warunek używamy w zapytaniu, i do bazy odwołujemy się tylko raz z przygotwanym wcześniej zapytaniem.
Teraz jak uzyskać coś takiego w LinQ ?
Można by tak:
var samochody1 = from s1 in _db.samochody
where s1.nazwa == podanaNazwa
select s1;
var samochody2 = from s2 in _db.samochody
where s2.marka == podanaMarka
select s2;
Samochod[] s = cześćWspólna(samochody1.ToArray<Samochod>(), samochody2.ToArray<Samochod>())
Czyli 2 zapytania do bazy a potem robię część wspólną z 2 tablic.
Idea jest ładna bo można ją łatwo rozszerzyć o nowe warunki ( np później chcę wyszukiwać po dacie która będzie większa/równa/mniejsza od podanej ) Ale...
..Ale jak widać to nie jest efektywne bo 2 razy wykonujemy zapytanie do bazy danych. Przy większej ilośći parametrów czas otrzymania odpowiedzi by był pewnie znacznie dłuższy.
Czyli tutaj znowu chciałbym wygenerować zapytanie w locie, w zależności od tego co podał użytkownik(i czy w ogóle coś podał )tak aby tylko jednorazowo odwołać się do bazy.
Czy ma ktoś może jakiś pomysł?
pzdr