2011-07-31 240 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(); 

上面的代码导致日期转换为字符串PostingDate = c.Date.ToString()时发生异常。任何想法如何解决这个问题?LINQ将DateTime转换为字符串

异常错误: {“LINQ到实体无法识别方法‘System.String的ToString()’方法,而这种方法不能被翻译成店表达”}

+2

哪个例外? – BrunoLM

+1

@BrunoLM,linq尝试将日期转换为使用sql的字符串,但由于没有在SQL中的ToString()方法它不能转换它,这种行为是由设计我相信。 – Joakim

+0

你能否给我们确切的例外。我不相信这是SQL中引发的错误。 – Baz1nga

回答

16

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

您可以补救的问题通过投影为匿名类型,然后在数据已经从数据库返回后,在稍后的步骤中输入到Post

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

然而,鉴于你有一个名为PostingDate财产的原始来源该日期,我建议你修改你的对象实际上保持值作为DateTime而不是字符串。

+0

我觉得这是我会做的,使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();