2012-04-25 11 views
6

Ho queste 4 caselle di controllo, che costituiscono le variabili stringa saljes, kopes, byte, erbjudes. Quando vengono controllati, ottengono il valore "on".Contains(), come invertire usando lambda

Da questo ho messo insieme una variabile stringa (p) che contiene tutti i numeri che voglio includere nell'istruzione LINQ. Diciamo che se tutte le checkbox sono spuntate, otterrei una stringa "1234", e se solo la checkbox 2 e 4 sono spuntate, risulterebbe in "24".

Nel mio database ho un campo chiamato "Tipo" che è di tipo int. Voglio dire al database di includere tutte le righe che hanno un valore di "Tipo" che può essere trovato nella stringa p.

Qualcosa di simile a questo (ovviamente il mio codice non funziona, quindi ho bisogno di voi ragazzi):

 var searchResult = from s in db.Ads select s; 
     string p = "1"; 

     if (saljes != "on") 
      p = p.Replace("1", ""); 
     if (kopes == "on") 
      p += "2"; 
     if (bytes == "on") 
      p += "3"; 
     if (erbjudes == "on") 
      p += "4"; 

     searchResult = searchResult.Where(s => p.Contains(s => s.Type.ToString()); 

Quello che ho un pò che dovete fare è di un'immagine capovolta Contiene(), ma come?

+0

Non è possibile utilizzare 'IEnumerable p'? Puoi sempre 'String.Join' se ne hai bisogno combinato, ma ti permetterebbe un maggiore controllo per quanto riguarda l'ottenimento di valori individuali. L'altra opzione è usare bit: 'Int32 p;' e test '(p & 1)', '(p & 4)', ecc. –

+0

Quindi se la tua stringa è '" 234 "' un valore di '24' dovrebbe essere trovato nel tuo db? –

+1

La tua domanda mi è un po 'oscura: sarebbe utile vedere alcuni esempi di ciò che si desidera avere per i vari valori di "Tipo". –

risposta

1

Contains() già è un 'IN rovesciata', come descritto here:

int[] productList = new int[] { 1, 2, 3, 4 }; 

var myProducts = from p in db.Products 
       where productList.Contains(p.ProductID) 
       select p; 

Quindi è sufficiente compilare un elenco:

var list = new List<int>(); 

if (saljes == "on") 
    list.Add(1); 
if (kopes == "on") 
    list.Add(2); 
if (bytes == "on") 
    list.Add(3); 
if (erbjudes == "on") 
    list.Add(4); 

var searchResult = db.Ads.Where(s => list.Contains(s.Type)); 
+1

Grazie mille! Anche se ho dovuto modificare un po 'il codice. Se ho provato l'espressione lambda all'interno di Contains() ha detto "Impossibile convertire espressione lambda in tipo int perché non è un tipo delegato". Anche se scrivo solo searchResult = searchResult.Where (s => list.Contains (s.Type)); funziona bene –

3
Non

chiaro quale sia il problema, ma questo dovrebbe funzionare:

searchResult = searchResult.Where(s => p.Contains(s.Type.ToString()); 

p è stringa e Contains(string value) prevede una stringa come parametro, quindi non è necessaria l'espressione lambda.

1

Questa espressione lo farebbe?

s => s.Type.ToString().ToCharArray().Except(p.ToCharArray()).Count() == 0 

E.g. Se s.Type è 24 e p è "234" quindi s.Type è incluso nella stringa. Se convertiamo il int ad un char-array otteniamo

{'2', '4'} 

La stringa convertita in un char-array è

{'2', '3', '4'} 

Ciò significa che le cifre del int sono tutti inclusi nel string. Quindi le cifre int tranne le cifre string producono un set vuoto che testiamo con Count() == 0.

{'2', '4'}.Except({'2', '3', '4'}) ==> { } 

Invece di creare un string, vorrei creare un List<char>

var p = new List<char>();    

if (saljes == "on") p.Add('1');    
if (kopes == "on") p.Add('2');    
if (bytes == "on") p.Add('3');    
if (erbjudes == "on") p.Add('4');    

Poi l'espressione diventa

s => s.Type.ToString().ToCharArray().Except(p).Count() == 0 

Tuttavia, essere consapevoli del fatto che non può essere convertito in una clausola SQL-where appropriata.Pertanto l'intera tabella dovrà essere scansionata.