var items = from c in contacts
select new ListItem
{
Value = c.ContactId, //Cannot implicitly convert type 'int' (ContactId) to 'string' (Value).
Text = c.Name
};
var items = from c in contacts
select new ListItem
{
Value = c.ContactId.ToString(), //Throws exception: ToString is not supported in linq to entities.
Text = c.Name
};
Kann ich das trotzdem erreichen? Beachten Sie, dass es in VB.NET kein Problem gibt, das erste Snippet zu verwenden. Es funktioniert einfach großartig. VB ist flexibel und kann sich nicht an die Strenge von C # gewöhnen !!!
c#
asp.net
linq-to-entities
tostring
Shimmy Weitzhandler
quelle
quelle
Antworten:
Mit EF v4 können Sie verwenden
SqlFunctions.StringConvert
. Es gibt keine Überladung für int, daher müssen Sie in ein Doppel oder eine Dezimalzahl umwandeln. Ihr Code sieht am Ende folgendermaßen aus:quelle
SqlFunctions.StringConvert((double)c.ContactId).Trim()
Ich habe ein ähnliches Problem gelöst, indem ich die Konvertierung der Ganzzahl in eine Zeichenfolge aus der Abfrage entfernt habe. Dies kann erreicht werden, indem die Abfrage in ein Objekt eingefügt wird.
quelle
Verwenden Sie LinqToObject: Kontakte. AsEnumerable ()
quelle
AsEnumerable
, zahlen Sie für größere Datenbanken einen hohen Leistungspreis, da dadurch alles gespeichert wird.IEnumerable
ist langsamer im Vergleich zu,IQueryable
weil letzteres ausschließlich in der Datenbank ausgeführt wird.SqlFunctions.StringConvert wird funktionieren, aber ich finde es umständlich, und die meiste Zeit muss ich die Zeichenfolgenkonvertierung auf der SQL-Seite nicht wirklich durchführen.
Wenn ich Zeichenfolgenmanipulationen durchführen möchte, führe ich zuerst die Abfrage in Linq-to-Entities aus und dann die Stings in Linq-to-Objects. In diesem Beispiel möchte ich einen Datensatz erhalten, der den vollständigen Namen eines Kontakts und ContactLocationKey enthält. Hierbei handelt es sich um die Zeichenfolgenverkettung zweier ganzzahliger Spalten (ContactID und LocationID).
Nun, ich gebe zu, dass es umständlich wird, zwei anonyme Auswahlen schreiben zu müssen, aber ich würde argumentieren, dass die Bequemlichkeit, mit der Sie Zeichenfolgenfunktionen (und andere) ausführen können, die in L2E nicht unterstützt werden, aufgewogen wird. Denken Sie auch daran, dass es bei dieser Methode wahrscheinlich zu Leistungseinbußen kommt.
quelle
quelle
return list.ToList();
möchten.return (from l in db.Customers orderby l.CompanyName select new {Id=l.CustomerID, Name=l.CompanyName}).AsEnumerable().Select(c=> new SelectListItem{Value=c.Id.ToString(), Text = c.Name}).ToList();
. Auf diese Weise wird nur die ID / der Name von der Datenbank abgerufen (anstelle aller Kundeneigenschaften) und die Sortierung unter Verwendung des effizienteren Index für die Datenbank durchgeführt.Zuerst in Objekt konvertieren, dann ist toString () korrekt.
quelle
Brian Cauthons Antwort ist ausgezeichnet! Nur ein kleines Update, für EF 6 wurde die Klasse in einen anderen Namespace verschoben. Vor EF 6 sollten Sie also Folgendes einschließen:
Wenn Sie auf EF 6 aktualisieren oder einfach diese Version verwenden, umfassen Sie:
Durch das Einfügen des falschen Namespace in EF6 wird der Code problemlos kompiliert, es wird jedoch ein Laufzeitfehler ausgegeben. Ich hoffe, dieser Hinweis hilft, Verwirrung zu vermeiden.
quelle
Ich bin auf dasselbe Problem gestoßen, als ich meine MVC 2-App auf MVC 3 konvertiert habe. Um eine andere (saubere) Lösung für dieses Problem zu finden, möchte ich veröffentlichen, was ich getan habe ...
GetProducers () gibt einfach eine Entitätssammlung von Produzenten zurück. PS Die SqlFunctions.StringConvert hat bei mir nicht funktioniert.
quelle
Wenn Ihr "Kontakt" als generische Liste fungiert, hoffe ich, dass der folgende Code gut funktioniert.
Vielen Dank.
quelle
Noch eine Lösung:
Fügen Sie einfach eine leere Zeichenfolge hinzu und diese wird in eine Zeichenfolge konvertiert.
quelle
Mit MySql hat das
SqlFunctions.StringConvert
bei mir nicht funktioniert. Da ichSelectListItem
in meinem Projekt mehr als 20 Stellen verwende, wollte ich eine Lösung, die funktioniert, ohne die über 20 LINQ-Anweisungen zu verzerren. Meine Lösung bestand darin, eine UnterklasseSelectedListItem
zu erstellen, um einen Integer-Setter bereitzustellen, der die Typkonvertierung von LINQ wegbewegt. Natürlich ist diese Lösung schwer zu verallgemeinern, war aber für mein spezifisches Projekt sehr hilfreich.Erstellen Sie zur Verwendung den folgenden Typ und verwenden Sie ihn in Ihrer LINQ-Abfrage anstelle von
SelectedListItem
und verwenden Sie IntValue anstelle von Value.quelle
Wenn Sie das Entity Framework verwenden und das einzige int akzeptabel machen möchten, können Sie dies in der Linq-Abfrage verwenden. Sie können dies versuchen
Dies funktioniert, da die Verwendung von (int) Ihren Wert in int umwandelt, sodass Sie keine Konvertierung für Zeichenfolge in int benötigen und das gewünschte Ergebnis erhalten.
Das hat bei mir in meinem Projekt funktioniert. Ich denke, es wäre hilfreich für Sie
quelle
Nach meinem Verständnis müssen Sie eine Teilklasse erstellen, um Ihr Modell zu "erweitern" und eine schreibgeschützte Eigenschaft hinzuzufügen, die die restlichen Eigenschaften der Klasse nutzen kann.
Dann
quelle
Ich habe festgestellt, dass
SqlFunctions.StringConvert((double)c.Age)
das bei mir auch nicht funktioniert hat. Das Feld ist vom TypNullable<Int32>
Ich habe in den letzten Tagen viel versucht, um dies zu finden.
Ich hoffe, das hilft ein paar Programmierern da draußen.
quelle
System.String Concat(System.Object)
kann nicht in einen Geschäftsausdruck übersetzt werden ... " ausgelöst .Kannst du es versuchen:
quelle