2011-07-31 11 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

あなたの問題を解決することができますデータベースから既にデータが返された後に、匿名型に投影してから、後のステッププロジェクトでPostに投影します。

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

しかし、あなたは元のソースは日付され、PostingDateというプロパティを持っていることを考えると、私は実際には文字列の代わりにDateTimeとしての価値を維持するために、あなたのオブジェクトあなたの改訂をお勧めします。

+0

私はそれがDateTime型としてPostingDateを行うことだと思っています。私は、日付の書式設定を実行する必要がないようにクライアントを保存したかったのですが、この場合は手助けできないようです。 – 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(); 
関連する問題