LINQ 将 DateTime 转换为字符串

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

上述代码在将日期转换为字符串时引发异常,PostingDate = c.Date.ToString()。有什么办法可以解决这个问题吗?

异常错误: {"LINQ to Entities不识别'System.String ToString()'方法,该方法无法转换为存储表达式。"}


1
@BrunoLM,linq试图使用SQL将日期转换为字符串,但由于SQL中没有ToString()方法,因此无法进行转换。我相信这是设计上的行为。 - Joakim
你能给我们提供确切的异常信息吗?我不相信这是SQL抛出的错误。 - Baz1nga
抱歉,我以为这是一个关于Hibernate的问题,我的错。 - Baz1nga
是的,这正是 @Joakim 所说的。 - BrunoLM
3个回答

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

2
您可以通过将数据投射到匿名类型中来解决问题,然后在稍后的步骤中,当数据已从数据库返回时,再将其投射到Post中。
(from ....
 select new { /* stuff */, Date = c.Date })
.AsEnumerable()
.Select(p => new Post { /* stuff */, PostingDate = p.Date.ToString() })
.ToList();

然而,鉴于您拥有一个名为PostingDate的属性,原始源是一个日期,我建议您修改对象,实际上将值保留为DateTime,而不是字符串。


我觉得我会将PostingDate设置为DateTime类型。我想让客户免于执行日期格式化,但在这种情况下似乎无法避免。 - Ronald

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接