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