LINQ преобразовать DateTime в строку
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.Свидание.Метод toString(). Есть идеи, как обойти это?
ошибка исключения : {"LINQ to Entities не распознает систему метода.Метод String ToString ()', и этот метод не может быть переведен в выражение хранилища."}
3 ответов
linq пытается преобразовать дату в строку с помощью sql, но поскольку в sql нет метода ToString (), он не может преобразовать его, это поведение по дизайну - Йоаким
другими словами, верните саму дату и преобразуйте ее в строку после выполнения на стороне 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(),
[...]
})
вы можете исправить свою проблему, проецируя в анонимный тип, а затем на более позднем этапе проекта в Post
после того, как данные уже были возвращены из БД.
(from ....
select new { /* stuff */, Date = c.Date })
.AsEnumerable()
.Select(p => new Post { /* stuff */, PostingDate = p.Date.ToString() })
.ToList();
однако, учитывая, что у вас есть свойство с именем PostingDate, источник быть дата, Я бы рекомендовал пересмотреть ваш объект, чтобы фактически сохранить значение как DateTime
вместо строки.
Я не думаю, что это можно сделать прямым способом.
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();