LINQ конвертировать DateTime в строку - PullRequest
6 голосов
/ 31 июля 2011
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();

Приведенный выше код вызывает исключение при преобразовании даты в строку PostingDate = c.Date.ToString (). Есть идеи как обойти это?

Ошибка исключения: {"LINQ to Entities не распознает метод метода System.String ToString () ', и этот метод нельзя преобразовать в выражение хранилища."}

Ответы [ 3 ]

17 голосов
/ 31 июля 2011

linq пытается преобразовать дату в строку, используя sql, но, поскольку в sql нет метода ToString (), он не может его преобразовать, такое поведение задуманно - Joakim

Другими словами, вернуть саму дату и преобразовать ее в строку после того, как она будет выполнена на стороне 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 голосов
/ 31 июля 2011

Вы можете устранить проблему, спроецировав в анонимный тип, а затем на более позднем этапе проектировать в Post после того, как данные уже были возвращены из БД.

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

Однако, учитывая, чтоу вас есть свойство с именем PostingDate , исходный источник является датой , я бы порекомендовал вам пересмотреть ваш объект, чтобы фактически сохранить значение как DateTime вместо строки.

0 голосов
/ 31 июля 2011

Я не думаю, что это можно сделать прямым способом.

   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();

Также с EF4 вы можете попробовать что-то вроде этого:

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();
...