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

Yukarıdaki kod, dize, PostingDate = c.Date.ToString() öğesinin dönüştürülmesinde istisna neden olur. Bu konuda bir fikrin var mı?LINQ convert DateTime - dize

İstisna hatası: { "varlıkları için LINQ yöntemi 'System.String ToString()' yöntemini tanımıyor ve bu yöntem bir mağaza ifadesi tercüme edilemez"}

+2

Hangi özel durum? – BrunoLM

+1

@BrunoLM, linq sql kullanarak dizeye dönüştürmeyi deniyor, ancak sql'de ToString() yöntemi bulunmadığından dönüştüremiyor, bu davranış tasarım olduğuna inanıyorum. – Joakim

+0

bize kesin istisnayı verebilir misiniz? Bunun SQL'de atılmış bir hata olduğuna inanmıyorum. – Baz1nga

cevap

16

linq kullanarak sql dizeye tarih dönüştürmek çalışıyor ama sql hiçbir ToString() yöntemi yoktur çünkü yapamazsınız: EF4'ü ile de

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

böyle bir şey deneyebilirsiniz

: Joakim başka deyişle

, tarih kendisini dönmek ve SQL tarafında yürütür sonra bir dizeye dönüştürmek - dönüştürmek, bu davranış tasarım gereğidir

(
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

Sen çözebilirsiniz senin sorunun Veriler anonim bir türe dönüştürülerek ve daha sonra bir sonraki projede, daha önce DB'den veri döndükten sonra Post. aslında yerine bir dize bir DateTime olarak değerini korumak için

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

Ancak, PostingDate adlı bir özellik, orijinal kaynak tarih olmak zorunda olduğu göz önüne alındığında, senin gözden geçirmek üzere nesneyi öneriyoruz.

+0

Bunu yapacağımı hissediyorum, PostingDate'i DateTime türü yap. İstemciyi tarih biçimlendirmesi yapmak zorunda kalmadan kaydetmek istedim, ancak bu durumda yardımcı olamayacağı anlaşılıyor. – Ronald

0

Bunun doğrudan bir şekilde yapılabileceğini sanmıyorum.

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(); 
İlgili konular