2011-02-16 3 views
1

Je ne sais pas comment nommer cela, donc si quelqu'un peut renommer cela de façon plus appropriée, ce serait apprécié.Entity Framework classes, l'extension des classes EF et l'ajout de propriétés personnalisées, iQueryable et Get méthode

Je suis bloqué quant à comment je peux aller remplir les propriétés personnalisées d'une classe partielle d'entités. Quelques exemples

// partial class from EF base class - base class contains 
// properties such as commentID, comment, userID etc 
// Comments.cs 
public partial class Comment { 

    public int UpVotes { get; set; } 
    public int DownVotes { get; set; } 

    public int CurrentVotes() 
    { 
     return UpVotes - DownVotes; 
    } 

} 

_

//CommentRepository.cs 
//snip 
public Comment GetItem(int id) 
{ 
    Comment c = db.Comments.SingleOrDefault(x => x.CommentID == id); 
    c.UpVotes = 0 //get UpVotes 
    c.DownVotes = 0 // get DownVotes 
    return c; 
} 

public IQueryable<Comment> GetAllCommentsByPage(int pageid) 
{ 
} 

public IQueryable<Comment> GetAllCommentsByPage(string slug) 
{ 
} 

public IQueryable<Comment> GetCommentSelection(int PageID, int Skip, int Take) 
{ 
} 

public int CountCommentByPage(int PageID) 
{ 
} 

Dans l'ancien temps 1.x .Net, j'aurais eu les méthodes GetAllx sélectionner une liste de CommentIDs, alors peuplé une nouvelle liste en utilisant List.Add (GetItem (ID)).

Dans EF4, je veux faire similaire, mais ne pas perdre sur l'exécution retardée de IQueryables.
Dans quelques cas, j'ai trouvé utile d'empiler ces méthodes GetAllx en succession rapide avant de faire un final .ToList() ou similaire pour obtenir les données réelles.

Y a-t-il une manière raisonnable pour moi de faire ce que j'espère être assez simple et m'échapper? Je détesterais avoir à changer chaque méthode pour retourner une liste statique d'éléments qui peuvent être générés grâce à la méthode GetItem.

Merci d'avance.

----- ----- modifier

D'accord, voici la solution que j'ai actuellement:

public List<Comment> IQueryable2ToList(IQueryable<Comment> c) 
{ 
    List<Comment> comments = new List<Comment>(); 
    List<int> ids = c.Select(x => x.CommentID).ToList(); 
    foreach (int id in ids) { 
     comments.Add(GetComment(id)); 
    } 
    return comments; 
} 

que j'appelle en faisant:

List<Comment> comments = (new CommentRepository()).IQueryable2ToList(db.FindAllCommentsByPage(slug)); 

qui vient semble un peu sale en quelque sorte ...

+0

Quelle partie du code que vous avez ne fonctionne pas réellement? –

+0

Désolé, peut-être que je n'ai pas été clair. Rien n'est cassé en termes réels. Je veux juste que chacune des sélections IQuerable renvoie une liste de commentaires telle que présentée dans GetItem (avec mes paramètres supplémentaires personnalisés) plutôt que les paramètres de stock que EF retournerait. –

Répondre

1

Eh bien, vous pouvez éliminer les sélections n + 1:

public List<Comment> IQueryable2ToList(IQueryable<Comment> comments) 
{ 
    List<Comment> comments = comments.ToList() 
    foreach (Comment c in comments) { 
     c.UpVotes = 0 //get UpVotes 
     c.DownVotes = 0 // get DownVotes 
    } 
    return comments; 
} 

Cependant, ce n'est pas ce que je ferais. Au lieu de cela, je ferais un modèle de présentation et projet:

public class CommentPresentation { 

    public int CommentID { get; set; } 
    public string WittyInsight { get; set; } 
    public int UpVotes { get; set; } 
    public int DownVotes { get; set; } 

    public int CurrentVotes() 
    { 
     return UpVotes - DownVotes; 
    } 
} 

public IQueryable<CommentPresentation> ToPresentation(IQueryable<Comment> comments) 
{ 
    return from c in comments 
      select new CommentPresentation 
      { 
       CommentId = c.CommentId, 
       WittyInsight = c.WittyInsight, 
       UpVotes = 0, 
       DownVotes = 0 
      }; 
} 

Si vous voulez attribuer autre chose qu'une constante, vous pouvez passer par AsEnumerable(), de sorte que vous voulez faire une première recherche. Mais cela devrait vous aider à démarrer.

Questions connexes