2009-06-02 7 views
1

J'ai un problème lorsque j'utilise ListView et Linq comme source de données. L'erreur vers le bas:La distribution spécifiée n'est pas valide. ListView et 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 

code source

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 

} 

Cette fonction a du travail avant, donc je ne peux pas comprendre quel est le problème. Merci pour votre aide.

+0

Est-IForumThreadPost une interface? – bytebender

Répondre

2

Sans voir plus de code ou de structure de base de données, il sera difficile d'arriver à une bonne solution. Voir la table ForumThreadPostDetails et la classe LinqToSql générée serait idéal.

Les éléments ThreadId et PostId sont-ils tous les deux dans la base de données? Les types correspondent-ils entre les propriétés dans IForumThreadPost et ForumThreadPostDetails (et la classe de détails hérite-t-elle de cette interface, s'il s'agit même d'une interface)?

Des modifications ont-elles été apportées à la table ForumThreadPostDetails dans la base de données (champs changeant de type, etc.)?

Pourquoi appelez-vous .AsEnumerable() sur votre table?

2

Le problème était que dans la base de données l'ID était int et dans le code il était long.

0

A peut voir quelques choses ici. ichiban est correct, changez le IForumThreadPost à ce qu'il devrait être (ForumThreadPost ???).

Aussi un ami m'a dit une fois que vous devriez utiliser les objets les plus simples possibles. Comme vous utilisez une Listview, je considérerais IEnumerable comme un tableau.

Par exemple:

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

} 
Questions connexes