2011-07-31 18 views
6
List<Post> list = 
(
    from c in db.TitleComments 
    join t in db.Titles on c.TitleId equals t.Id 
    join u in db.Users on c.UserId equals u.Id 
    where t.Id == _titleId && c.Date > time 
    orderby c.Date descending 
    select new Post { Username = u.Username, PostingDate = c.Date.ToString(), Data = c.Comment } 
).ToList(); 

Powyższy kod powoduje wyjątek przy konwersji daty na łańcuch znaków, PostingDate = c.Date.ToString(). Wszelkie pomysły, jak sobie z tym poradzić?LINQ przekształcić DateTime na ciąg

błąd

Wyjątek: { „LINQ do podmiotów nie rozpoznaje metoda«system.string toString()»metoda, a metoda ta nie może być tłumaczone na wyrażeniu magazynu”}

+2

Który wyjątek? – BrunoLM

+1

@ BrunoLM, linq próbuje przekonwertować datę na ciąg znaków przy użyciu języka sql, ale ponieważ nie ma metody ToString() w sql, nie można jej przekonwertować, to zachowanie jest zgodne z projektem. – Joakim

+0

możesz podać nam dokładny wyjątek. Nie wierzę, że jest to błąd generowany w SQL. – Baz1nga

Odpowiedz

16

LINQ próbuje konwertować datę do łańcucha za pomocą SQL, ale ponieważ nie ma metody toString() w SQL nie można przekształcić go, to zachowanie jest zgodne z projektem - Joakim

innymi słowy, sama data powrotu i przekonwertować go na sznurku po wykonywany po stronie SQL:

(
select new { Username = u.Username, 
    PostingDate = c.Date 
    [...] 
}) 
.ToList() // runs on SQL and returns to the application 
.Select(o => // is not generating a SQL, it is running on the app 
    new Post { Username = o.Username, 
     PostingDate = o.PostingDate.ToString(), 
     [...] 
    }) 
2

Można ich usunięcie problem przez rzutowanie na typ anonimowy, a następnie na późniejszy etap projektu na Post po tym, jak dane zostały już zwrócone z bazy danych.

(from .... 
select new { /* stuff */, Date = c.Date }) 
.AsEnumerable() 
.Select(p => new Post { /* stuff */, PostingDate = p.Date.ToString() }) 
.ToList(); 

Biorąc jednak pod uwagę, że trzeba właściwość o nazwie PostingDate, oryginalnego źródła bycia data, chciałbym polecić swojemu zrewidować swój obiekt rzeczywiście utrzymać wartość jako DateTime zamiast łańcucha.

+0

Czuję, że to, co zrobię, uczynić PostingDate typem DateTime. Chciałem uratować klienta przed koniecznością formatowania daty, ale wygląda na to, że nie można w tym przypadku pomóc. – Ronald

0

Nie sądzę, że można to zrobić w bezpośredni sposób.

var list =  
    select new Post { Username = u.Username, PostingDate = SqlFunctions.StringConvert(c.Date), Data = c.Comment } 
from 
(from c in db.TitleComments 
    join t in db.Titles on c.TitleId equals t.Id 
    join u in db.Users on c.UserId equals u.Id 
    where t.Id == _titleId && c.Date > time 
    orderby c.Date descending).AsEnumerable() 
    ).ToList(); 

także z EF4 można spróbować coś takiego:

List<Post> list = 
(
from c in db.TitleComments 
join t in db.Titles on c.TitleId equals t.Id 
join u in db.Users on c.UserId equals u.Id 
where t.Id == _titleId && c.Date > time 
orderby c.Date descending 
select new Post { Username = u.Username, PostingDate = SqlFunctions.DateName(c.Date), Data = c.Comment } 
).ToList();