LINQ, budowanie zapytań

0

Witam,
tworzę teraz aplikację Windows Forms z wykorzystaniem technologi LINQ. Aplikacja korzysta z bazy. W bazie mam dla przykładu tablę o nazwie Osoba a w niej kolumny: imie, nazwisko, pesel, płeć itp.
Użytkownik mojej aplikacji będzie miał możliwość wpisania w odpowiednie TextBoxy szukane parametry, np.
TextBoxImie.Text = "Jan", TextBoxNazwisko.Text = "Kowalski" itd. Oczywiście w zamierzeniu będzie mógł wybrać co wpisuje czyli np. samo imie i PESEL, czy też nazwisko i imię itd.

Pytanie mam takie:
Jak budować dynamiczne zapytanie w LINQu tzn. czy muszę po kolei rozważać każdy przypadek:

if(!string.IsNullOrEmpty(TextBoxImie.Text) && string.IsNullOrEmpty(TextBoxNazwisko.Text))
{
var q = from a in db.Osobas
where a.imie = TextBoxImie
select a;
}

itd. aż do wyczerpania wszystkich możliwości, czy może istnieje jakiś prostszy sposób budowania takich zapytań?

Dziękuję za odpowiedzi.

0

Jeśli użytkownik nie wpisał imienia to przypisujemy mu "Wszystkie" w innym przypadku dodajemy na sam początek znak procenta, analogicznie robimy z innymi zmiennymi

if (string.IsNullOrEmpty(imie))
{
      imie = "Wszystkie";
}
else
{
      imie = imie.Insert(0, "%");
}

Przed porównaniem zmiennych dodajemy do każdego rekordu na sam początek "Wszystkie%" i dopiero porównujemy z tym co wpisał użytkownik.

var q = from a in db.Osobas
            where a.imie.Insert(0, "Wszystkie%").Contains(imie)
            select a;

Nie jest to zbyt eleganckie rozwiązanie ale działa.

Edit:
rozwiązanie: http://stackoverflow.com/questions/848415/linq-dynamic-where-clause

0

mozna troche prosciej:

var q = from os in db.Osobas;

if (!string.IsNullOrEmpty(TextBoxImie.Text))
q = q.Where(os => os.imie == TextBoxImie.Text);

if (!string.IsNullOrEmpty(TextBoxNazwisko.Text))
q = q.Where(os => os.nazwisko == TextBoxNazwisko.Text);

... kolejne warunki

linq zrobi z tego query i wykona zapytanie dopiero kiedy bedziesz chcial cos zrobic z danymi zwracanymi przez query, czyli np. zrobisz q.ToList() zeby dostac liste osob
nie musisz wszystkiego napisac jako jedno query
poza tym linq i tak rozwija twoje query na ciag wywolan metod .Select .Where etc. (tych z rozszerzenia IEnumerable)
wydaje mi sie ze wyglada lepiej niz dostawianie jakiegos ciagu znakow :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1