2012-04-13 16 views
0

Ich versuche, Suchfunktion in meinem Projekt zu machen.MVC LINQ mit Where-Bedingung

Derzeit möchte ich den Dezimalwert in Zeichenfolge für den Vergleich mit SearchString konvertieren.

Wenn ich so:

public ActionResult Search(string searchString) 
    { 

     var product = from a in _db.Product.Include(a => a.Category) 
         select a; 
     if (!String.IsNullOrEmpty(searchString)) 
     { 
      product = product.Where(a => a.model.ToUpper().Contains(searchString.ToUpper()) 
           || Convert.ToInt32(a.displaySize).ToString().Contains(searchString)); 
     } 
     return View(product.ToList()); 
    } 

Es Fehler hat,

'LINQ to Entities erkennt nicht die Methode 'System.String ToString()' Methode'.

Wie kann ich den Dezimalwert mit dem Zeichenfolgenwert vergleichen?

Können Sie mir helfen?

Danke.

+0

Doppelte Frage? http://stackoverflow.com/questions/10140634/mvc-where-condition-with-search-function –

+0

Ich löste dieses Problem durch 'SqlFunctions.StringConvert (a.displaySize). Enthält (searchString)'. – wholee1

Antwort

2

Sie können keine C# -Funktionen verwenden, die nicht in SQL konvertiert werden können, wie .ToString(). Sie können LINQ to Objects verwenden Sie stattdessen, wenn Ihre Tabelle durch den Aufruf .ToList() vor Where

product = product.ToList().Where(a => a.model.ToUpper().Contains(searchString.ToUpper()) 
            || Convert.ToInt32(a.displaySize).ToString().Contains(searchString)); 

EDIT nicht sehr groß ist:

Sie Funktionen aus SqlFunctions Namensraum nutzen können. Diese Funktionen können leicht in SQL konvertiert werden.

+0

Auf einer sehr großen Liste würde dies sehr langsam sein, da die ToList würde die linq ausgeführt werden und dann tun Sie Ihre wo. – Qpirate

+0

Ich habe bereits erwähnt, dass die Art, wie .ToList() aufgerufen wird, nur für Tabellen mit ein paar Zeilen geeignet ist. –

+0

Sorry ich habe das nicht gesehen. aber wie du es erwähntest, entschuldige ich mich – Qpirate

1

Sie könnten versuchen, Ihren String-Wert (Abfrageparameter) in eine Dezimalzahl umzuwandeln und den umgekehrten Wert zu vergleichen.

1

Es sieht so aus, als ob Sie nach zwei verschiedenen Dingen suchen. Ich würde diese Linq-Anweisung bei der || aufteilen. Wenn Sie nach dem suchen, was a.model ist, gehen Sie zu einer Methode, wenn Sie nach dem int-Wert suchen, gehen Sie zu einem anderen und konvertieren Sie den Suchstring in ein int vor dem linq-Statement. Diese Methode würde gerne so etwas wie:

int searchInt; 

if(int.TryParse(searchString, out searchInt)) 
{ 

    product = product.Where(a => a.displaySize == searchInt); 
} 

Sie haben, dies zu tun, da SQL keine Methode ToString() hat ... so LINQ nicht wirklich weiß, was mit ihm zu tun. Denken Sie daran, dass dies alles in SQL konvertiert wird.