String.Aufgeteilt in eine Linq-To-SQL-Abfrage?
Ich habe eine Datenbank-Tabelle, die enthält eine nvarchar-Spalte wie folgt:
1|12.6|18|19
Habe ich ein Business-Objekt, das hat einen Decimal [] - Eigenschaft.
Meine LINQ-Abfrage wie folgt aussieht:
var temp = from r in db.SomeTable select new BusinessObject {
//Other BusinessObject Properties snipped as they are straight 1:1
MeterValues = r.MeterValues.Split('|').Select(Decimal.Parse).ToArray()
};
var result = temp.ToArray();
Dieser löst eine NotSupportedException: Method 'System.String[] Split(Char[])' has no supported translation to SQL.
Das ein bisschen nervt 🙂 gibt es eine Möglichkeit, kann ich dies tun, ohne dass Sie eine string-Eigenschaft, um die business-Objekt oder die Auswahl eines anonymen Typs und dann Durchlaufen Sie?
Meine aktuelle "Lösung" ist:
var temp = from r in db.SomeTable select new {
mv = r.MeterValues,
bo = new BusinessObject { //all the other fields }
};
var result = new List<BusinessObject>();
foreach(var t in temp) {
var bo = t.bo;
bo.MeterValues = t.mv.Split('|').Select(Decimal.Parse).ToArray();
result.Add(bo);
}
return result.ToArray(); //The Method returns BusinessObject[]
Ziemlich hässlich aber mit, dass die temporäre Liste.
Ich habe versucht, das hinzufügen einer let mv = r.MeterValues.Split('|').Select(Decimal.Parse).ToArray()
aber das führt im wesentlichen zu den gleichen NotSupportedException.
Dies ist .net 3.5SP1, wenn diese Angelegenheiten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie zu zwingen, die
select
- Klausel auf dem client ausgeführt durch den Aufruf.AsEnumerable()
erste:Select
vor der.AsEnumerable
.where
- Klausel vorAsEnumerable
.AsEnumerable
führt die SQL-Abfrage, ist das richtig? Wird diese geändert, EF6/7? Ich habe eineContact.FullName
Eigentum und ich haben Suchbegriffe enthalten teilweise Namen, ich will wieder alleFullName
s, die alle Wörter enthält, die mit beginnen alle Begriffe. Wie kann ich dies mit verzögerter Ausführung verzögerte Ausführung?Können Sie nicht verwenden, split, aber in diesem Szenario können Sie Folgendes tun:
Dieser code fügt äußeren pipes ( | ), um den Datenbank-Wert on-the-fly innerhalb der Abfrage, so dass Sie tun können, der Anfang, Mitte und Ende-Wert entspricht, auf den string.
Z. B. der obige code sieht für "|19|" innen "|1|12.6|18|19|", was gefunden wird und gültig ist. Dies funktioniert für alle anderen valueToFind.
Brauchen Sie nicht zu verwenden, eine temporäre Liste:
Leider seine die IQueryable, die Sie verwenden (Linq to SQL), die nicht die Unterstützung der Split-Funktion.
Sind Sie wirklich nur mit der linken, die IEnumerable (Linq to Objects) Unterstützung in diesem Fall. Sie die zweite code-snippet, was Sie tun müssen, oder sowas...