2009-06-02 18 views
1

ListViewとLinqをデータソースとして使用すると問題が発生します。エラーダウン:指定されたキャストは無効です。 ListViewとLinq

Specified cast is not valid. 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.InvalidCastException: Specified cast is not valid. 


System.Data.SqlClient.SqlBuffer.get_Int64() +58 
    System.Data.SqlClient.SqlDataReader.GetInt64(Int32 i) +38 
    Read_ForumThreadPostDetail(ObjectMaterializer`1) +95 
    System.Data.Linq.SqlClient.ObjectReader`2.MoveNext() +29 
    System.Linq.WhereSelectEnumerableIterator`2.MoveNext() +96 
    System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) +7667556 
    System.Linq.Enumerable.ToList(IEnumerable`1 source) +61 

ソースコード

Public IEnumerable<IForumThreadPost> GetForumPostByThreadAndPost() 
{ 
    ScoutDataDataContext sd = new ScoutDataDataContext(); 
    long ThreadId = Convert.ToInt64(HttpContext.Current.Request.QueryString["id"]); 
    long PostId = Convert.ToInt64(HttpContext.Current.Request.QueryString["postId"]); 
    ///.Skip((pageIndex - 1)*pageSize).Take(pageSize) + int pageIndex, int pageSize 
    return sd.ForumThreadPostDetails 
      .AsEnumerable() 
      .Where(f => f.ThreadId.Equals(ThreadId) && f.PostId.Equals(PostId)) 
      .Select(f => 
       new IForumThreadPost 
       { 
        Id = f.Id, 
        ThreadId = f.ThreadId, 
        PostId = f.PostId, 
        Title = f.Title, 
        ThreadTitle = f.ThreadTitle, 
        Content = f.Content, 
        UserFullName = f.UserFullName, 
        UserId = f.UserId 
       }).ToList(); // error here 

} 

この関数は、前に仕事を持っているので、私は問題が何であるかを把握することができません。 ご協力いただきありがとうございます。

+0

インタフェースはIForumThreadPostですか? – bytebender

答えて

2

多くのコードやデータベース構造を見ることなく、優れた解決策を見つけるのは難しいでしょう。 ForumThreadPostDetailsテーブルとLinqToSqlクラスを生成するのが理想的です。

ThreadIdとPostIdは両方とも 'BigInt's'ですか?

IForumThreadPost内のプロパティとForumThreadPostDetailsの間で型が一致しますか(また、インタフェースであっても詳細クラスはこのインタフェースを継承しますか?)

データベース内のForumThreadPostDetailsテーブルに変更がありましたか(フィールドのタイプ変更など)?

なぜあなたのテーブルで.AsEnumerable()を呼び出していますか?

2

問題は、データベースではIDがintで、コードが長いことです。

0

ここにはいくつかのことがあります。 ichibanが正しい場合は、IForumThreadPostを何にしてもかまいません(ForumThreadPost ???)。

また、可能な限り最も単純なオブジェクトを使用する必要がある場合は、友人に教えてください。 Listviewを使用しているので、IEnumerableを配列に変更することを検討します。

例:

Public ForumThreadPost[] GetForumPostByThreadAndPost() 
{ 
    ScoutDataDataContext sd = new ScoutDataDataContext(); 
    var result = sd.ForumThreadPostDetails 
      .Where(f => f.ThreadId.Equals(ThreadId) && f.PostId.Equals(PostId)) 
      .Select(f => 
        new ForumThreadPost 
        { 
          Id = f.Id, 
          ThreadId = f.ThreadId, 
          PostId = f.PostId, 
          Title = f.Title, 
          ThreadTitle = f.ThreadTitle, 
          Content = f.Content, 
          UserFullName = f.UserFullName, 
          UserId = f.UserId 
        }); 

    return result.ToArray(); 

} 
関連する問題