2016-06-17 9 views
0

Ich verwende LINQ zu Entities, und ich erstelle eine generische Klasse, die dynamische Abfragen auf Basis der Felder markieren kann, die der Benutzer möchte Suche in der App.Formatierung von Dezimalstellen in dynamischem LINQ zu Entitäten "where" Klausel

Dies könnte auf beliebiger Art von Entity in meiner Datenbank verwendet werden, so verwende ich String-basierte Where-Klauseln.

Mit System.Linq.Dynamic habe ich einige grundlegende Beispiele arbeiten, z.

String-Feld enthält:

var data = db.Products; 
var query = String.Format("{0}.Contains(@0)", filter.property); 
data = data.Where(query, filter.value); 

Feld Nummer größer ist als:

var data = db.Products; 
var query = String.Format("{0} > @0", filter.property); 
data = data.Where(query, filter.value); 

Diese Beispiele funktionieren beide gut.

Ich muss jetzt ein Dezimal "gleich" erstellen, aber das Problem ist, dass der Währungswert in der Datenbank 10.3125 sein kann, aber es wird in der App UI als 10.31 angezeigt, also wenn ein Benutzer einschränken möchte, wo Preis ist gleich "10.31", es werden keine Ergebnisse zurückgegeben. Was ich tun müssen, ist einen Vergleich durchführen, indem die Anzahl der Dezimalstellen, auf zwei zu beschränken, wenn die Datenbank abfragt, und Vergleichen dass auf den Dezimalwert eingegeben des Benutzers, etwa wie folgt:

var data = db.Products; 
var query = String.Format("Decimal.Round({0}, 2).Equals(@0)", filter.property); 
data = data.Where(query, filter.value); 

Wo „filter.property“ ist der Spalten-/Feldname und "filter.value" enthält den Dezimalwert.

Allerdings wirft dies einen Laufzeitfehler:

An exception of type 'System.ArgumentException' occurred in System.Core.dll but was not handled in user code

Additional information: Argument types do not match

ich nicht viele anständige Beispiele für stringbasierte LINQ zu finden, wo Klauseln betreffen Dezimalzahlen oder Formatierung von Zahlen scheinen kann.

Gibt es Vorschläge, wie dies funktioniert? Als letzten Ausweg könnte ich alle Daten aus der Tabelle zurückholen, die Dezimalzahlen entsprechend im Speicher formatieren und schließlich die Where-Klauseln zur In-Memory-Ergebnismenge hinzufügen, aber das wäre bei Ressourcen viel schwerer. Sicherlich gibt es eine Möglichkeit, dies dynamisch mit LINQ to Entities zu tun?

Vielen Dank im Voraus.

Antwort

0

Es ist einfacher, eine Bereichsprüfung zu verwenden, wobei der Bereich der Filterwert ist +/- 0,005:

10.305 < value <= 10.315 

Es ist auch besser, es auf diese Weise zu tun, denn wenn man um den Wert Datenbank zuerst die Der Abfrageoptimierer kann keine Indizes mehr verwenden. Die Suche ist nicht sargable.

+0

Ehrfürchtig, danke! –