2011-07-31 3 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 문자열로 변환

예외 오류 : { ". 엔티티에 LINQ는 방법 '선택 System.String ToString() 메서드를 인식하지 않으며,이 방법은 상점 표현으로 변환 될 수 없다"}

+2

어떤 예외가 있습니까? – BrunoLM

+1

@BrunoLM, linq는 sql을 사용하여 문자열로 날짜를 변환하려하지만 sql에서 ToString() 메소드가 변환되지 않기 때문에이 동작은 변환 할 수 없습니다. – Joakim

+0

정확한 예외를 알려 주실 수 있습니까? 나는 이것이 SQL에서 던져진 오류라고 생각하지 않는다. – Baz1nga

답변

16

LINQ는 SQL을 사용하여 문자열로 날짜를 변환하려고하지만 SQL에는 ToString() 메소드가 없기 때문에이 작업을 수행 할 수 없습니다 EF4와 또한

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

이 뭔가를 시도 할 수 있습니다

: 조아킴 즉

, 날짜 자체를 반환하고 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

을 당신은 구제 할 수 있습니다 문제 익명 형식으로 투영 한 다음 나중에 단계 프로젝트에서 데이터가 이미 DB에서 반환 된 후 Post으로 변환합니다. 실제로 대신 문자열의 DateTime로 값을 유지하려면

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

그러나 PostingDate라는 속성, 원본 소스 날짜 인이 주어진, 난 당신의 개정을 개체를 추천 할 것입니다.

+0

필자는 PostingDate를 DateTime 형식으로 만들 것이라고 생각합니다. 클라이언트에게 날짜 형식을 지정하지 않아도 되길 원했지만,이 경우에는 도움이되지 않는 것처럼 보입니다. – Ronald

0

나는 이것이 직접적인 방법으로 행해질 수 있다고 생각하지 않는다.

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