2016-04-06 24 views
6

Ho un modulo di ricerca in cui l'utente può immettere uno a molti parametri (Dati, Stato, Tipo, ID, Riepilogo, Descrizione) e lasciare il resto vuoto.Linq to SQL - Ignora i parametri di ricerca nulli o nulli

Ecco il mio codice Linq per SQL per la ricerca di base. C'è un modo per controllare ogni parametro all'interno del Linq per zero, stringa vuota o vuota?

List<RequestStatusModel> objRequestStatus = new List<RequestStatusModel>(); 
var query = from r in SimCareDB.Requests 
      where r.CustomerID == 31  
      select (new RequestStatusModel 
      { 
       RequestID = r.RequestID, 
       RequestTitle = r.RequestTitle, 
       DateAdded = r.DateAdded.ToString(), 
       DateChanged = r.DateChanged.ToString(), 
       RequestStatusID = r.StatusID 
      }); 

Grazie!

+0

perché deve essere 'in' query LINQ? – Marco

+0

Tutte ottime risposte, questo ha risolto il mio problema. Grazie! – Simon

risposta

0

Se si desidera filtrare solo se viene passato determinati criteri, si dovrebbe fare qualcosa di simile

var objRequestStatus = new List<RequestStatusModel>(); 
    var query = from r in SimCareDB.Requests 
       where r.CustomerID == 31 

if (String.IsNullOrEmpty(r.RequestID)) 
    objRequestStatus = objRequestStatus.Where(x => x.RequestID == r.RequestID); 

if (String.IsNullOrEmpty(r.RequestTitle)) 
    objRequestStatus = objRequestStatus.Where(x => x.RequestTitle == r.RequestTitle); 

//you other filters here 

Questo imposta l'espressione a ciò che si desidera in base al quale le richieste vengono passate

1

Se non deve essere nella tua istruzione linq, puoi farlo solo con le classiche istruzioni if.

List<RequestStatusModel> objRequestStatus = new List<RequestStatusModel>(); 
var query = from r in SimCareDB.Requests 
      where r.CustomerID == 31 
      select (new RequestStatusModel 
      { 
       //... 
      }); 

if(data != null) //Replace with additional checks, if neccessary 
{ 
    query = query.where(x=> ...); 
} 

if(status != null) 
{ 
    query = query.where(x => ...) 
} 
0

Se si vuole evitare tutti quei if s, si potrebbe fare

List<RequestStatusModel> objRequestStatus = new List<RequestStatusModel>(); 
var query = from r in SimCareDB.Requests 
      where (r.CustomerID == 31) && 
        (!String.IsNullOrEmpty(id) ? r.RequestID == id : true) && 
        (!String.IsNullOrEmpty(status) ? r.StatusID == status : true) 
        /* And so on */ 
      select (new RequestStatusModel 
      { 
       RequestID = r.RequestID, 
       RequestTitle = r.RequestTitle, 
       DateAdded = r.DateAdded.ToString(), 
       DateChanged = r.DateChanged.ToString(), 
       RequestStatusID = r.StatusID 
      }); 
+0

Tutti questi controlli saranno tradotti nel database ed eseguiti lì. Ciò potrebbe causare problemi sfortunati, come la selezione errata del piano di query o l'impossibilità di utilizzare un indice favorevole. –