Frage

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
            };

Gibt es trotzdem ich das erreichen kann? Beachten Sie, dass in VB.NET es kein Problem ist, den ersten Schnipsel verwenden Sie sich einfach toll funktioniert, VB ist flexibel, im nicht in der Lage zu C # 's Strikt zu gewöhnen !!!

War es hilfreich?

Lösung

Mit EF v4 können Sie verwenden SqlFunctions.StringConvert . Es gibt keine Überlast für int, so dass Sie zu einem doppelten oder einer Dezimalzahl werfen müssen. Ihr Code sieht letzten Endes wie folgt aus:

var items = from c in contacts
            select new ListItem
            {
                Value = SqlFunctions.StringConvert((double)c.ContactId).Trim(),
                Text = c.Name
            };

Andere Tipps

löste ich ein ähnliches Problem durch die Umwandlung der ganze Zahl zu String aus der Abfrage platzieren. Dies kann, indem die Abfrage in ein Objekt erreicht werden.

var items = from c in contacts
            select new 
            {
                Value = c.ContactId,
                Text = c.Name
            };
var itemList = new SelectList();
foreach (var item in items)
{
    itemList.Add(new SelectListItem{ Value = item.ContactId, Text = item.Name });
}

Mit LinqToObject. Kontakte AsEnumerable ()

var items = from c in contacts.AsEnumerable()
            select new ListItem
            {
                Value = c.ContactId.ToString(),
                Text = c.Name
            };

SqlFunctions.StringConvert funktionieren wird, aber ich finde es umständlich, und die meiste Zeit, ich habe keine wirkliche Notwendigkeit, die String-Konvertierung auf der SQL-Seite auszuführen.

Was ich tun, wenn String-Manipulationen tun möchten, ist die Abfrage in Linq-to-Einheiten führen Sie zuerst, dann manipulieren, um die Stiche in Linq-to-Objekte. In diesem Beispiel möchte ich eine Reihe von Daten erhalten, einen Kontakt Vollernamen enthalten, und ContactLocationKey, die die Zeichenfolge Verketten von zwei Integer-Spalten (ContactID und LocationID) sind.

// perform the linq-to-entities query, query execution is triggered by ToArray()
var data =
   (from c in Context.Contacts
   select new {
       c.ContactID,
       c.FullName,
       c.LocationID
   }).ToArray();

// at this point, the database has been called and we are working in
// linq-to-objects where ToString() is supported
// Key2 is an extra example that wouldn't work in linq-to-entities
var data2 =
   (from c in data
    select new {
       c.FullName,
       ContactLocationKey = c.ContactID.ToString() + "." + c.LocationID.ToString(),
       Key2 = string.Join(".", c.ContactID.ToString(), c.LocationID.ToString())
    }).ToArray();

Nun gewähren ich, dass es mühsam bekommt zu haben zwei anonyme wählt zu schreiben, aber ich würde behaupten, dass durch die Bequemlichkeit aufgewogen wird von dem Du string (und andere) Funktionen nicht unterstützt in L2E auszuführen. Denken Sie auch daran, dass es wahrscheinlich eine Leistungseinbuße mit dieser Methode ist.

public static IEnumerable<SelectListItem> GetCustomerList()
        {
            using (SiteDataContext db = new SiteDataContext())
            {
                var list = from l in db.Customers.AsEnumerable()
                           orderby l.CompanyName
                           select new SelectListItem { Value = l.CustomerID.ToString(), Text = l.CompanyName };

                return list.ToList();
            }
        }
var selectList = db.NewsClasses.ToList<NewsClass>().Select(a => new SelectListItem({
    Text = a.ClassName,
    Value = a.ClassId.ToString()
});

Zum einem Objekt umwandeln, dann toString () korrekt sein wird.

Brian Cauthon Antwort ist ausgezeichnet! Nur ein kleines Update für EF 6, wurde die Klasse in einem anderen Namespace verschoben. Also, bevor EF 6, sollten Sie schließen ein:

System.Data.Objects.SqlClient

Wenn Sie EF aktualisieren 6 oder einfach sind mit dieser Version gehören:

System.Data.Entity.SqlServer

Durch die falsche Namespace mit EF6 einschließlich, kompiliert der Code nur gut, aber wird einen Laufzeitfehler werfen. Ich hoffe, dass diese Note hilft einige Verwirrung zu vermeiden.

Ich lief in das gleiche Problem, wenn ich meine MVC 2 App MVC 3 konvertieren und einfach eine andere (clean) Lösung für dieses Problem, das ich zu stellen zu geben, was ich habe ...

IEnumerable<SelectListItem> producers = new SelectList(Services.GetProducers(),
    "ID", "Name", model.ProducerID);

GetProducers () gibt einfach eine Einheit Sammlung von Produzenten. P. S. Die SqlFunctions.StringConvert nicht für mich arbeiten.

Wenn Sie Ihren „Kontakt“ als generische Liste handelt, ich hoffe, der folgende Code funktioniert gut.

var items = contact.Distinct().OrderBy(c => c.Name)
                              .Select( c => new ListItem
                              {
                                Value = c.ContactId.ToString(),
                                Text = c.Name
                              });

Danke.

Mit MySql hat die SqlFunctions.StringConvert nicht für mich arbeiten. Da ich SelectListItem in 20+ Orten in meinem Projekt verwenden, wollte ich eine Lösung, die die 20+ LINQ-Anweisungen ohne contorting arbeiten. Meine Lösung war zu Subklasse SelectedListItem um einen ganzzahligen setter zu schaffen, die von LINQ weg Typkonvertierung bewegt. Offensichtlich ist diese Lösung nur schwer zu verallgemeinern, aber war sehr hilfreich für mein konkretes Projekt.

den folgenden Typen zu verwenden, erstellen und in Ihrer LINQ-Abfrage anstelle von SelectedListItem verwenden und intValue anstelle von Wert verwenden.

public class BtoSelectedListItem : SelectListItem
{
    public int IntValue
    {
        get { return string.IsNullOrEmpty(Value) ? 0 : int.Parse(Value); }
        set { Value = value.ToString(); }
    }
}

Eine weitere Lösung:

c.ContactId + ""

Just leere Zeichenfolge hinzufügen und es wird in einem String umgewandelt werden.

Wenn Sie Entity Framework verwenden, und Sie wollen, dass die nur int akzeptabel dann machen, können Sie dies in Linq-Abfrage verwenden, können Sie dies versuchen

var items = from c in contacts
        select new ListItem
        {
            Value = (int)ContractId 
            Text = c.Name
        };

es wird funktionieren, weil mit (int) Ihrem Wert auf den int gegossen werden, so dass Sie jede Umwandlung nicht brauchen für String in int und Sie das gewünschte Ergebnis erhalten.

das für mich in meinem Projekt arbeitete ich denke, es ist für Sie hilfreich wäre,

Mein Verständnis ist, dass Sie eine Teil-Klasse erstellen, müssen Sie Ihr Modell „erweitern“ und eine Eigenschaft hinzufügen, die nur lesbar ist, die den Rest der Klasse Eigenschaften nutzen können.

public partial class Contact{

   public string ContactIdString
   {
      get{ 
            return this.ContactId.ToString();
      }
   } 
}

Dann

var items = from c in contacts
select new ListItem
{
    Value = c.ContactIdString, 
    Text = c.Name
};
var items = from c in contacts
select new ListItem
{
    Value = String.Concat(c.ContactId), //This Works in Linq to Entity!
    Text = c.Name
};

Ich fand, dass SqlFunctions.StringConvert((double)c.Age) nicht für mich arbeiten entweder das Feld ist vom Typ Nullable<Int32>

Hat mir eine Menge in den letzten Tagen der Prüfung der Suche und Fehler, dies zu finden.

Ich hoffe, das gibt ein paar Programmierer hilft.

Können Sie versuchen:

var items = from c in contacts
        select new ListItem
        {
            Value = Convert.ToString(c.ContactId), 
            Text = c.Name
        };
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top