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

Đoạn mã trên gây ra ngoại lệ về việc chuyển đổi ngày thành chuỗi, PostingDate = c.Date.ToString(). Bất kỳ ý tưởng làm thế nào để có được xung quanh này?LINQ chuyển đổi DateTime thành chuỗi

ngoại lệ lỗi: { "LINQ to Entities không nhận ra phương pháp 'System.String ToString()' phương pháp, và phương pháp này không thể được dịch sang một biểu hiện cửa hàng"}

+2

Ngoại lệ nào? – BrunoLM

+1

@BrunoLM, linq đang cố gắng chuyển đổi ngày thành chuỗi bằng sql nhưng vì không có phương thức ToString() trong sql, nó không thể chuyển đổi nó, hành vi này là do tôi thiết kế. – Joakim

+0

bạn có thể cho chúng tôi biết ngoại lệ chính xác không. Tôi không tin rằng đây là một lỗi được ném trong SQL. – Baz1nga

Trả lời

16

LINQ đang cố gắng để chuyển đổi ngày đến chuỗi sử dụng sql nhưng vì không có phương pháp ToString() trong sql nó không thể chuyển đổi nó, hành vi này là do thiết kế - Joakim

Nói cách khác, trở về ngày chính nó và chuyển nó sang một chuỗi sau khi nó thực thi trên SQL bên:

(
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

Bạn có thể khắc phục vấn đề của bạn bằng cách chiếu vào một loại vô danh, và sau đó tại một dự án bước sau vào Post sau khi dữ liệu đã được trả về từ DB.

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

Tuy nhiên, cho rằng bạn có một tài sản gọi là PostingDate, nguồn gốc là một ngày, tôi muốn giới thiệu điều chỉnh lại của bạn đối tượng của bạn để thực sự giữ giá trị như một DateTime thay vì một chuỗi.

+0

Tôi cảm thấy đó là những gì tôi sẽ làm, làm cho PostingDate là loại DateTime. Tôi muốn lưu khách hàng khỏi phải thực hiện định dạng ngày, nhưng có vẻ như không thể tránh được trong trường hợp này. – Ronald

0

Tôi không nghĩ rằng điều này có thể được thực hiện một cách trực tiếp.

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

Ngoài ra với EF4 bạn có thể thử một cái gì đó như thế này:

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(); 
Các vấn đề liên quan