2017-04-07 6 views
0

Ich versuche, ein Modell mit zwei Drop-Down in einem MVC-ProjektDynamische Wo in Linq MVC

var model = (from x in db.TABLE.... 
      join y in db.TABLE...).Where(where)... 

meine Logik zu filtern ist

  String where = string.Empty; 

      if (search.anno != null) 
       where = " ANNO = " + search.anno ; 

      if (search.Cliente != null) 
      { 
       if (!string.IsNullOrEmpty(where)) 
       { 
        where += " And CODICE_CLIENTE = '" + search.Cliente + "'";     } 
       else 
       { 
        where = " CODICE_CLIENTE = '" + search.Cliente + "'"; 
       } 
      } 

i einen Fehler: System.Linq.Dynamic. ParseException: Zeichenliteral muss genau ein Zeichen enthalten

Ich bekomme das in wo + = "Und CODICE_CLIENTE = '" + search.Cliente + "'";

ich sah, dass der Apex am Ende ‚“

ist

wie lösen können

+0

Haben Sie den Fehler erhalten, wenn search.anno ist nicht null? –

+0

ja! Ich sah in debug ANNO = 2015 Und CODICE_CLIENTE = '00106' "und ich bekomme diesen Fehler – jon

+0

, wenn nur Anno gefiltert wird der Controller funktioniert ... aber mit dem Kundenfilter funktioniert nicht – jon

Antwort

-1

Sie benötigen für den Ausdruck Doppel Gleichen verwenden und doppelte Anführungszeichen für die Saiten String where = string.Empty;

  if (search.anno != null) 
       where = " ANNO == " + search.anno ; 

      if (search.Cliente != null) 
      { 
       if (!string.IsNullOrEmpty(where)) 
       { 
        where += " And CODICE_CLIENTE == \"" + search.Cliente + "\"";     } 
       else 
       { 
        where = " CODICE_CLIENTE == \"" + search.Cliente + "\""; 
       } 
      } 

Hinweis, dass dies eine SQL-Injection anfällig ist und sollte vermieden werden, sollten Sie Parameter verwenden, das so etwas wie:

var model = (from x in db.TABLE.... join y in db.TABLE...).Where(whereString, params)... 
+0

Eine Antwort, die [SQL Injection Attacks] erlaubt (https://en.wikipedia.org/wiki/SQL_injection) Ich bin nicht einverstanden. –

+0

Richtig! Wie SQL! Können Sie mir zeigen, wie mit dem obigen Beispiel? – jon

0

Dieses Beispiel in Linq übersetzt, ohne dass Sql Injection Attacks

 String where = string.Empty; 

     if (search.anno != null) 
      where = " ANNO = " + search.anno ; 

     if (search.Cliente != null) 
     { 
      if (!string.IsNullOrEmpty(where)) 
      { 
       where += " And CODICE_CLIENTE = '" + search.Cliente + "'";     } 
      else 
      { 
       where = " CODICE_CLIENTE = '" + search.Cliente + "'"; 
      } 
     } 

aussehen würde:

IQueryable<x> query = (from x in db.TABLE.... 
    join y in db.TABLE...); 


if (search.anno != null) 
{ 
    query = query.Where(x => x.ANNO == search.anno); 
} 

if (search.Cliente != null) 
{ 
    query = query.WHere(x => x.CODICE_CLIENTE == search.Cliente); 
} 

var model = query.ToList(); // or await query.ToListAsync(); 
+0

Ok Ich kenne diese Art von Logik! Aber ich versuche, dynamische Linq zu verwenden, um das http://StackOverflow.com/questions/43201615/improve-pivot zu verbessern -linq-to-entities – jon

+0

an dieser Stelle wählen Sie neu { ANNO = ordine.Anno, LINEA = linea, MESE = ordine.Datord.Value.Month, CODICE_CLIENTE = ordine.Codcli, IMPORTO = rigaOrdine.Import }) wobei (wo) – jon

+0

niemand Antwort und so habe ich versucht, mit dynamischen linq. Filtern des IQueryable Objekt i verbessert etwa 60% Zeitausführung – jon

0

Ich löste so ...
String where = string.Empty; Objekt [] Parameter = Null;

if (search.anno != null) 
     where = " ANNO = @0 "; 
     parameters = new object[] { search.anno }; 

    if (search.Cliente != null) 
    { 
     if (!string.IsNullOrEmpty(where)) 
     { 
      where += " && CODICE_CLIENTE = @1"; 
      parameters = new object[] { search.anno, search.Cliente }; 
     } 
     else 
     { 
      where = " CODICE_CLIENTE = @0"; 
      parameters = new object[] { search.Cliente }; 
     } 
    } 

    if (search.linea != null) 
    { 
     if (!string.IsNullOrEmpty(where)) 
     { 
      where += " && LINEA.Contains(@2) "; 
      parameters = new object[] { search.anno, search.Cliente, search.linea }; 
     } 
     else 
     { 
      where = " LINEA.Contains(@0) "; 
      parameters = new object[] { search.linea }; 
     } 
    } 

aber das Problem ist mit LINEA Eigenschaft (anonimous Typ): es Zeichenfolge ist und ich kippe Verwendung Enthält (@p) Tanks wieder für die ganze Wiederholung und helfen Ihnen zur Verfügung gestellten