LINQ将DateTime转换为字符串

时间:2011-07-31 05:44:03

标签: asp.net-mvc linq entity-framework entity

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

上面的代码导致将date转换为string,PostingDate = c.Date.ToString()的异常。任何想法如何解决这个问题?

异常错误: {“LINQ to Entities无法识别方法'System.String ToString()'方法,并且此方法无法转换为商店表达式。”}

3 个答案:

答案 0 :(得分:17)

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(),
        [...]
    })

答案 1 :(得分:2)

您可以通过投射到匿名类型来解决您的问题,然后在数据已经从数据库返回后将项目导入Post

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

但是,鉴于您有一个名为 PostingDate 的属性,原始源是一个日期,我建议您修改您的对象以实际将值保持为{ {1}}而不是字符串。

答案 2 :(得分:0)

我不认为这可以直接完成。

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