2013-08-09 19 views
5

Mam formularz, który filtruje dane w zależności od tego, co wybiorą.Jak dołączyć do siebie kwerendy LINQ?

Próbuję dołączyć zapytania linq do siebie nawzajem, tak aby efekt końcowy był taki, jaki wybrał na ekranie.

Oto mój kod:

private void button_Search_Click(object sender, EventArgs e) 
{ 
    using (var model = new SuburbanPortalEntities()) 
    { 
    var qry = from logs in model.Logs 
       select logs; 

    Guid corpid; 
    if (Guid.TryParse(textBox_CorporationGuid.Text, out corpid)) 
    { 
     qry = from logs in model.Logs 
       where logs.CorporationId == corpid 
       select logs; 
    } 

    Guid tokenid; 
    if (Guid.TryParse(textBox_TokenId.Text, out tokenid)) 
    { 
     qry = from logs in model.Logs 
      where logs.TokenId == tokenid 
      orderby logs.LogDateTime descending 
      select logs; 
    } 

    if (checkBox_DisplayErrors.Checked) 
    { 
     qry = from logs in model.Logs 
      where logs.IsException 
      select logs; 
    } 

    if (checkBox_DisplayWarnings.Checked) 
    { 
     qry = from logs in model.Logs 
      where logs.IsWarning 
      select logs; 
    } 

    dataGridView1.DataSource = qry; 


    } 
} 

mam szczęścia. Ostatni qry w to, co jest wyświetlane na moim datagridview.

Czy ktoś może mi pokazać, co robię źle?

Dzięki!

+0

ze swojego 2 zapytania, można wyszukać z wyniku wrócił z poprzedniego zapytania. – zsong

+0

Zmieniasz zmienną 'qry' z nowym wynikiem za każdym razem, podobnie jak robi' int a = 0; a = 1; ' – sinelaw

Odpowiedz

8

To, co się tutaj dzieje, polega na ponownym zdefiniowaniu qry z danych źródłowych za każdym razem. qry jest IEnumerable<T> tak samo jak logs, więc powinieneś być w stanie zastąpić swój kod tak:

var qry = model.Logs; 

if(// Condition) 
    qry = qry.Where(x => x.CorporationId == corpId); 

if(// Another condition) 
    qry = qry.Where(x => x.IsException); 

Pod koniec tej konfiguracji qry będzie skład wszystkich wybranych Where klauzul i powinny produkować tylko przedmioty, których szukasz.

+0

tego właśnie szukałem! Dzięki Tejs – ErocM

+3

'qry' jest' IQueryable ', a nie' IElumerable '. (Chociaż 'IQueryable ' dziedziczy po 'IEnumerable '.) To bardzo ważne rozróżnienie. – Servy

5

Można użyć LINQ Concat:

qry = qry.Concat(
      from logs in model.Logs 
      where logs.CorporationId == corpid 
      select logs); 

Z drugiej strony, może chcesz utworzyć kwerendę w oparciu o warunki, które wybiorą odpowiednie rezultaty, więc można zapytać źródło danych raz.

+1

OP prawdopodobnie chce [Concat] (http://msdn.microsoft.com/en-us/library/bb302894.aspx) (który dołącza wyniki) zamiast Unii (która wykonuje zestaw związków) – sinelaw

+0

Dzięki, zredagowałem swoją odpowiedź, aby objąć metodę "Concat", ponieważ może to być właśnie to, co OP chce. – Zbigniew

+0

Należy zauważyć, że w zależności od konkretów, użycie 'Concat' nie musi obejmować dwóch zapytań DB. Zapytania mogą być łączone przez dostawcę zapytań i skutkować pojedynczym zapytaniem przesłanym do bazy danych. – Servy

0

Mogę polecić za pomocą funkcji Kreatora predykatów w LinqKit. Możesz dodać dodatkowe parametry wyszukiwania za pomocą metod And i Or.

Użyłem tego do tego celu i działałem naprawdę dobrze.

0

Spróbuj użyć Concat:

private void button_Search_Click(object sender, EventArgs e) 
{ 
    using (var model = new SuburbanPortalEntities()) 
    { 
    var qry = (from logs in model.Logs 
       select logs).ToList(); 

Guid corpid; 
if (Guid.TryParse(textBox_CorporationGuid.Text, out corpid)) 
{ 
    qry.Concat((from logs in model.Logs 
      where logs.CorporationId == corpid 
      select logs).ToList()); 
} 

Guid tokenid; 
if (Guid.TryParse(textBox_TokenId.Text, out tokenid)) 
{ 
    qry.Concat(from logs in model.Logs 
     where logs.TokenId == tokenid 
     orderby logs.LogDateTime descending 
     select logs).ToList()); 
} 

if (checkBox_DisplayErrors.Checked) 
{ 
    qry.Concat((from logs in model.Logs 
     where logs.IsException 
     select logs).ToList()); 
} 

if (checkBox_DisplayWarnings.Checked) 
{ 
    qry.Concat((from logs in model.Logs 
     where logs.IsWarning 
     select logs).ToList()); 
} 

dataGridView1.DataSource = qry; 

} }

Powiązane problemy