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
};
Czy w ogóle mogę to osiągnąć? Zauważ, że w VB.NET nie ma problemu z użyciem pierwszego fragmentu, który działa po prostu świetnie, VB jest elastyczny, nie jestem w stanie przyzwyczaić się do surowości C # !!!
c#
asp.net
linq-to-entities
tostring
Shimmy Weitzhandler
źródło
źródło
Odpowiedzi:
Z EF v4 możesz korzystać
SqlFunctions.StringConvert
. Nie ma przeciążenia dla int, więc musisz rzutować na podwójny lub dziesiętny. Twój kod wygląda następująco:źródło
SqlFunctions.StringConvert((double)c.ContactId).Trim()
Rozwiązałem podobny problem, umieszczając konwersję liczby całkowitej na ciąg znaków poza zapytaniem. Można to osiągnąć poprzez umieszczenie zapytania w obiekcie.
źródło
Użyj LinqToObject: kontakty. AsEnumerable ()
źródło
AsEnumerable
, zapłacisz wysoką wydajność w większych bazach danych, ponieważ przyniesie to wszystko do pamięci.IEnumerable
jest wolniejszy w porównaniu z tym,IQueryable
że później jest wykonywany wyłącznie w bazie danych.SqlFunctions.StringConvert będzie działać, ale uważam, że jest to uciążliwe i przez większość czasu nie mam prawdziwej potrzeby wykonywania konwersji ciągów po stronie SQL.
To, co robię, jeśli chcę wykonywać operacje na łańcuchach, to najpierw wykonać zapytanie w linq-na-byty, a następnie manipulować żądłami w linq-na-obiektach. W tym przykładzie chcę uzyskać zestaw danych zawierający pełną nazwę kontaktu i ContactLocationKey, który jest ciągiem połączenia dwóch kolumn liczb całkowitych (ContactID i LocationID).
Przyznaję, że kłopotliwe jest pisanie dwóch anonimowych selekcji, ale argumentowałbym, że przewyższa to wygoda wykonywania funkcji łańcuchowych (i innych) nieobsługiwanych w L2E. Należy również pamiętać, że ta metoda prawdopodobnie wiąże się z ograniczeniem wydajności.
źródło
źródło
return list.ToList();
!!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();
. Wykonanie tego w ten sposób pobiera tylko identyfikator / nazwę z bazy danych (zamiast wszystkich właściwości klienta) i wykonuje sortowanie przy użyciu bardziej wydajnego indeksu w bazie danych.Po pierwsze, przekonwertuj na obiekt, a następnie toString () będzie poprawne.
źródło
Odpowiedź Briana Cauthona jest doskonała! Tylko mała aktualizacja, dla EF 6 klasa została przeniesiona do innej przestrzeni nazw. Tak więc przed EF 6 powinieneś dołączyć:
Jeśli aktualizujesz do EF 6 lub po prostu używasz tej wersji, dołącz:
Dołączając niepoprawną przestrzeń nazw do EF6, kod kompiluje się dobrze, ale generuje błąd czasu wykonywania. Mam nadzieję, że ta notatka pomoże uniknąć nieporozumień.
źródło
Natknąłem się na ten sam problem podczas konwersji mojej aplikacji MVC 2 na MVC 3 i aby dać inne (czyste) rozwiązanie tego problemu, chcę opublikować to, co zrobiłem ...
GetProducers () po prostu zwraca kolekcję encji producentów. PS SqlFunctions.StringConvert nie działało dla mnie.
źródło
Jeśli Twój „kontakt” działa jak ogólna lista, mam nadzieję, że poniższy kod działa dobrze.
Dzięki.
źródło
Jeszcze jedno rozwiązanie:
Wystarczy dodać pusty ciąg, a zostanie on przekonwertowany na ciąg.
źródło
Korzystanie z MySql
SqlFunctions.StringConvert
nie działało dla mnie. Ponieważ używamSelectListItem
w swoim projekcie ponad 20 miejsc, chciałem rozwiązania, które działałoby bez zniekształcania instrukcji ponad 20 LINQ. Moim rozwiązaniem było podklasęSelectedListItem
, aby zapewnić funkcję ustawiania liczb całkowitych, która odsuwa konwersję typów od LINQ. Oczywiście to rozwiązanie jest trudne do uogólnienia, ale było bardzo pomocne w moim konkretnym projekcie.Aby użyć, utwórz następujący typ i użyj w zapytaniu LINQ zamiast
SelectedListItem
i użyj IntValue zamiast Value.źródło
jeśli używasz frameworku encji i chcesz, aby jedyna int była akceptowalna, możesz użyć tego w zapytaniu linq, możesz to wypróbować
zadziała, ponieważ użycie (int) rzuci twoją wartość na int, więc nie potrzebujesz żadnej konwersji łańcucha na int i uzyskasz pożądany wynik.
to działało dla mnie w moim projekcie, myślę, że byłoby to dla ciebie pomocne
źródło
Rozumiem, że musisz utworzyć klasę częściową, aby „rozszerzyć” swój model i dodać właściwość, która jest tylko do odczytu, która może wykorzystać resztę właściwości klasy.
Następnie
źródło
Stwierdziłem, że
SqlFunctions.StringConvert((double)c.Age)
to nie działa dla mnie albo pole jest typuNullable<Int32>
Wiele razy szukałem w ciągu ostatnich kilku dni prób i błędów, aby to znaleźć.
Mam nadzieję, że pomoże to kilku programistom.
źródło
System.String Concat(System.Object)
nie można przetłumaczyć na wyrażenie sklepu ... ”.Możesz spróbować:
źródło