2013-08-09 16 views
5

Ho un modulo che filtra i dati in base a ciò che selezionano.Come si aggiungono le query LINQ tra loro?

Sto cercando di aggiungere le query di linq tra di loro in modo che il risultato finale sia quello che hanno selezionato sullo schermo.

Ecco il mio codice:

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; 


    } 
} 

sto avendo fortuna. L'ultimo qry in è ciò che viene visualizzato sul mio datagridview.

Qualcuno può mostrarmi cosa sto facendo male?

Grazie!

+0

Dalla seconda query, è possibile interrogare dal risultato restituito dalla query precedente. – zsong

+0

Si sta sovrascrivendo la variabile 'qry' con un nuovo risultato ogni volta, non diversamente da' int a = 0; a = 1; ' – sinelaw

risposta

8

Che cosa sta succedendo qui è che stai ridefinendo qry dai tuoi dati di origine ogni volta. qry è un IEnumerable<T> proprio come logs, così si dovrebbe essere in grado di sostituire il codice in questo modo:

var qry = model.Logs; 

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

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

Alla fine di questa configurazione, qry sarà la composizione di tutti i selezionati Where clausole e dovrebbe produrre solo gli articoli che stai cercando.

+0

questo è quello che stavo cercando! Grazie a Tejs – ErocM

+3

'qry' è un' IQueryable ', non un' IEnumerable '. (Sebbene 'IQueryable ' erediti da 'IEnumerable '.) È una distinzione molto importante. – Servy

5

È possibile utilizzare LINQ Concat:

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

D'altra parte, è possibile creare query basata sulle condizioni che selezionerà risultati appropriati, in modo da interrogare l'origine dati una volta.

+1

L'OP probabilmente vuole [Concat] (http://msdn.microsoft.com/en-us/library/bb302894.aspx) (che aggiunge i risultati) piuttosto che Union (che esegue una unione di set) – sinelaw

+0

Grazie, ho modificato la mia risposta per includere il metodo 'Concat' in quanto questo potrebbe essere ciò che l'OP vuole. – Zbigniew

+0

Si noti che, a seconda delle specifiche coinvolte, l'utilizzo di 'Concat' non implicherà necessariamente due query DB. Le query possono essere combinate dal provider di query e generare una singola query inviata al database. – Servy

0

Posso consigliare l'utilizzo della funzione Predicate Builder in LinqKit. Puoi aggiungere ulteriori parametri di ricerca usando i metodi And e Or.

L'ho usato esattamente per questo scopo e ha funzionato molto bene.

0

Provare a utilizzare 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; 

}}

Problemi correlati