2017-12-26 4 views
0

Ich verwende diesen Code:Wie kann ich eine Datenbank mit LINQ abfragen, wenn die Spalte eine Zahl ist, aber ich habe eine Zeichenfolge in der WHERE?

query = String.IsNullOrEmpty(options.PhraseNum) ? 
       query : 
       query.Where(w => w.PhraseNum == Convert.ToInt32(options.PhraseNum)); 

Allerdings bekomme ich einen Fehler:

LINQ to Entities does not recognize the method 'Int32 ToInt32(System.String)' method, and this method cannot be translated into a store expression.

Gibt es eine Weise, die ich dies in LINQ tun können, und wenn nicht, wie kann ich außerhalb dieses konvertieren und haben Die Konvertierung verursacht keine Ausnahme, wenn die Zeichenfolge nicht null ist?

+4

Konvertieren Sie einfach die Zeichenfolge in int außerhalb der Abfrage selbst. – Evk

+0

Gibt es eine Möglichkeit, dies auch dann zu tun, wenn die Zeichenfolge null ist? Ich möchte eine Ausnahme vermeiden. – Alan2

+0

'Convert.ToInt32 (string)' löst keine Ausnahme aus, wenn die Zeichenfolge null ist. Es gibt 0. https://msdn.microsoft.com/en-us/library/sf1aw27b(v=vs.110).aspx –

Antwort

7

Nur query ändern, wenn die Zeichenfolge kann zu einem int analysiert werden, die eine implizite Prüfung ist, wenn es nicht null oder leer ist:

if (int.TryParse(options.PhraseNum, out var phraseNum)) 
{ 
    query = query.Where(w => w.PhraseNum == phraseNum); 
} 

Bevor C# 7 die Syntax war

int phraseNum; 
if (int.TryParse(options.PhraseNum, out phraseNum)) 
etc. 
+0

@MotKohn Danke, gut, das zu erwähnen. Nicht jeder ist auf der neuesten C# Version, also bin ich ein bisschen konservativ :) –

+0

Ich dachte, meine Bearbeitung wäre ein Vorschlag. Habe nicht realisiert, dass ich die Erlaubnis habe, direkt zu editieren. – Allrameest

+1

@Allrameest Sogar Vorschläge sollten mit Zuversicht gemacht werden :) Aber mir geht es gut. –

2

Es scheint, dass LINQ versucht, den Ausdruck Convert.ToInt32(options.PhraseNum) auf der Serverseite als Teil der WHERE-Klausel auszuwerten.

Wiederholen Sie den Code so, dass die Variable auf der Client-Seite außerhalb des Abfrageausdruck explizit gegossen wird:

Int32 phrase_num = String.IsNullOrEmpty(options.PhraseNum) ? 0 : Convert.ToInt32; 
query = String.IsNullOrEmpty(options.PhraseNum) ? query : query.Where(w => w.PhraseNum == phrase_num); 

Oder für eine sauberere Ansatz Gesamt:

if(!String.IsNullOrEmpty(options.PhraseNum)) 
{ 
    Int32 phrase_num = Convert.ToInt32(options.PhraseNum); 
    query = query.Where(w => w.PhraseNum == phrase_num); 
} 

denke ich, dass lösen sollte das Problem und bewahren Sie die beabsichtigte Programmlogik.

EDIT: Ich würde Gert Arnold Ansatz oben befürworten, wenn Sie die neueste C# -Version verwenden, wo Out-Parameter in der TryParse-Methode selbst aufgerufen werden können.

Verwandte Themen