2017-12-07 4 views
0

Nun, das klingt einfacher als es ist! Ich habe eine Tabelle, die als Zeichenfolge Werte gespeichert enthält. Aber mein Code benötigt sie als Dezimalwerte und sie müssen als Teil der Abfrage, die IQueryable macht, in Dezimalzahlen umgewandelt werden! Daher ist die Verwendung von .ToList() nicht möglich. Die Besetzung muss von der Datenbank dahinter erledigt werden.
Dieses IQueryable ist im Grunde Teil einer Kette auf IQueryables, so dass eine nächste Abfrage einen Filter auf diesen Betrag hinzufügen könnte, um eine kleinere Auswahl zu treffen oder andere Arten von Mathe mit dem Betrag zu machen. Die Abfrage, die eingeht, ist möglicherweise bereits eine Unterauswahl aller Daten.
Edit: Lassen Sie mich erklären, was ich hier arbeite: Ich habe etwas wie dieses Verfahren haben zu schreiben:Wie konvertiert man eine Zeichenfolge in eine Dezimalzahl in einem IQueryable

public static IQueryable<PriceList> GetPriceList(this IQueryable<PriceData> query) => query.Select(d => new PriceList{Name = d.Item.Name, Price = decimal.Parse(d.Value)}).AsQueryable(); 

Und PriceData ist ein Datensatz ein paar Felder und die Preise als String-Werte enthalten. Aber der PriceList-Datensatz benötigt sie als Dezimal.
Diese Methode könnte dann von einer anderen Erweiterungsmethode für weitere Auswahlen, Mathematik und was auch immer verwendet werden. Es ist nur, dass decimal.parse und andere Optionen nicht innerhalb eines IQueryable funktionieren ...

+1

Wie wäre es 'dbContext.someTable.SqlQuery ("SELECT CONVERT (Betrag, DECIMAL) FROM sometable") AsIQueryable()'? –

+0

Wenn ich das nur könnte, ja. Aber nein. Ich bekomme ein IQueryable als Eingabe und muss ein IQueryable als Ausgabe ausgeben, da es alles Teil eines größeren Ausdrucksbaums ist ... –

+1

Warum ist der Preis in erster Instanz eine Zeichenkette? Das scheint falsch zu sein. (Und sollte wahrscheinlich Geld, Dezimal sein). Das heißt, * wahrscheinlich * ein Duplikat von https://stackoverflow.com/questions/12118258/int-parse-in-linq-expression –

Antwort

1

Wie bereits kommentiert, was Sie versuchen, wird nicht unterstützt.

  • Ihre beste Wette ist Ihre Datenbank Feldtyp zu ändern, was es actualy darstellt: Geld/Dezimal
  • Wenn das nicht möglich ist, mit der Person zu sprechen, die die Fähigkeit hat, um es möglich zu machen

Wenn das nicht möglich ist, ist die nächste Abhilfe, die ich vorstellen kann, ist:

public class PriceList 
{ 
    public string Price { get; set; } 
    public decimal ParsedPrice => decimal.Parse(Price); 
} 

Und dann:

.Select(d=>new PriceList 
{ 
    Price = d.Price 
}); 

Sie können jedoch keine DbOperations auf ParsedPrice dann ausführen. Beachten Sie auch, dass Sie keinen Konstruktor mit Parametern in EF6 verwenden können. Das wäre das nächste Problem, dem Sie begegnen würden.

EF funktioniert am besten für CRUD. Für alles andere solltest du wahrscheinlich einen Service haben, der die Daten, die du nur brauchst, holt, materialisiert und daraus ein DTO oder BusinessObject macht.

So etwas Ähnliches.

public class MyService 
{ 
    public IEnumerable<PriceList> GetPriceList(Expression<Func<MyEntity, bool>> predicate) 
    { 
     var data = _context.MyEntity.Where(predicate).ToList(); 
     foreach (var item in data) 
     { 
      var dto = new PriceList {...} 
      yield return dto; 
     }   
    } 
} 
+0

Ja, es ist ärgerlich, da EF die statische Klasse SqlFunctions hat, die numerische Werte in Strings konvertieren kann. Warum also keine ähnlichen Dinge in die andere Richtung umwandeln? Ich fand https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/ef/language-reference/clr-method-to-canonical-function-mapping, das keine String-Tonnummer auflistet Konvertierungen, so scheint es, ist es nicht möglich. Für jetzt ... –

+1

Wahrscheinlich, weil jedes int String sein kann, aber nicht jeder String kann ein int sein. Aber ich möchte keine Vermutungen anstellen, ich bin mir nicht 100% ig sicher. –

+0

True, aber wenn die Konvertierung fehlschlägt, könnten Sie NAN als Ergebnis zurückgeben. Oder eine Ausnahme so viele Datenbanken werden genauso leicht Fehler zurückgeben. Aber sowohl DBFunctions als auch SqlFunctions scheinen darauf hinzuweisen, dass es möglich sein sollte, C# -Funktionen ihrem SQL-Gegenstück zuzuordnen. Andererseits wird die Notwendigkeit, Zeichenketten in Zahlen umzuwandeln, als Designfehler betrachtet. Eine, die ich nicht im aktuellen System beheben kann. –

Verwandte Themen