2013-05-14 9 views
5

Mam pisanie kwerendy LINQ do wypełnienia listview, ale używa on metody .ToString(), który apparetly jest niedozwolone. Gdy używam poniższy kod pojawia się komunikat o błędzie:Korzystanie z ToString() w zapytaniach LINQ?

Error: LINQ to Entities does not recognize the method 'System.String ToString()' method, and this method cannot be translated into a store expression

Czy istnieje sposób, aby użyć toString() w LINQ lub jeżeli nie jest to możliwe, co jest rozwiązaniem do konwersji DateTime do String w zapytaniu . Proszę knot że ReleaseDateName jest ciągiem i ReleaseDate jest DateTime

using (var db = new ReleaseInfo()) 
{ 
    lvReleaseInfo.DataSource = (from r in db.MediaReleases 
           join rn in db.ReleaseNames 
           on new { MediaReleaseID = r.MediaReleaseID, CultureCodeID } equals new { rn.MediaReleaseID, rn.CultureCodeID } 
           join plat in db.MediaPlatforms 
           on new { MediaPlatformID = r.MediaPlatformID, CultureCodeID } equals new { plat.MediaPlatformID, plat.CultureCodeID } 
           join pub in db.MediaPublishers 
           on new { MediaPublisherID = r.MediaPublisherID, CultureCodeID } equals new { pub.MediaPublisherID, pub.CultureCodeID } 
           join c in db.Countries 
           on new { CountryID = r.CountryID, CultureCodeID } equals new { c.CountryID, c.CultureCodeID } 
           join rd in db.ReleaseDates 
           on new { MediaReleaseID = r.MediaReleaseID, CultureCodeID } equals new { rd.MediaReleaseID, rd.CultureCodeID } 
           join a in db.AffiliateLinks 
           on new { MediaReleaseID = r.MediaReleaseID, CultureCodeID } equals new { a.MediaReleaseID, a.CultureCodeID } 
           where r.SectionID == SectionID 
           select new 
           { 
            rn.ReleaseTitle, 
            plat.MediaPlatformName, 
            pub.MediaPublisherName, 
            c.CountryName, 
            ReleaseDate = (rd.ReleaseDate == null ? rd.ReleaseDateName : rd.ReleaseDate.ToString()), 
            a.AffiliateLinkAddress 
           }).ToList(); 
    lvReleaseInfo.DataBind(); 
} 

Odpowiedz

7

Ponieważ jesteś materializacji zapytanie i tak Sprzedawców, można zrobić konwersję na stronie .NET, zamiast w RDBMS, tak:

... 
select new { 
    rn.ReleaseTitle, 
    plat.MediaPlatformName, 
    pub.MediaPublisherName, 
    c.CountryName, 
    rd.ReleaseDateName, 
    rd.ReleaseDate, 
    a.AffiliateLinkAddress 
}).AsEnumerable() // <<== This forces the following Select to operate in memory 
.Select(t => new { 
    t.ReleaseTitle, 
    t.MediaPlatformName, 
    t.MediaPublisherName, 
    t.CountryName, 
    ReleaseDate = t.ReleaseDateName ?? t.ReleaseDate.ToString() 
    t.AffiliateLinkAddress   
}).ToList(); 

od ToString() nazywa się na elemencie z IEnumerable<T>, to już nie zawiedzie. Zwróć także uwagę na użycie operatora ?? w miejsce warunku sprawdzania wartości null pod numerem ? :.

+0

Jestem nowym użytkownikiem LINQ dla Etityes, czy możesz wyjaśnić, jak działa funkcja .Select? –

+2

@MatthewVerstraete '.Select' jest po prostu składnią metody. Jest taki sam, jak w przypadku użycia 'select' w składni zapytania. 't => {...}' jest wyrażeniem lambda. Zasadniczo mówi się, że każdy element, który wybieramy, robi to, co jest po prawej stronie operatora '=>'. – evanmcdonnal

+0

Dzięki, myślałem również o konwersji tego na Proc na serwerze SQL, ponieważ jest to dość złożone połączenie. Konwersja na Proc pozwoliłaby mi również na logikę po stronie serwera SQL. Czy przydałoby się przyzwoite ulepszenie wydajności, aby przejść proc i metodę? –

0

Problem polega na tym, że nie można wywołać ToString() na polu, dopóki nie zostanie deserialized. Więc zamiast próbować wywołać w zapytaniu ToString(), po prostu zrób to później na wynikach.

W bazie danych wartość, na której pracujesz, nie ma pojęcia o ToString() i dlatego pojawia się błąd. Zapytanie może wyglądać i czuć się jak kod C#, ale należy pamiętać, że pod okładkami, które są przekształcane do zapytania SQL, jak każdy inny. Po uzyskaniu listy można napisać bardzo proste zapytanie LINQ, aby rozwiązać problem.