2009-10-13 5 views
0

public class ForumTopique { public Guid ForumTopicId {get; ensemble; } public Guid OwnerId {get; ensemble; } public Guid CatégorieId {get; ensemble; } public DateTime CreatedDate {get; ensemble; } public string Sujet {get; ensemble; } public bool IsSticky {get; ensemble; } public bool IsClosed {get; ensemble; } public int ViewCount {get; ensemble; } public int TotalComments {get; ensemble; } public Commentaire Dernier Commentaire {get; ensemble; }} Association filtrée Linq to SQL?


J'ai alors une requête Linq et je dois comprendre comment remplir le LastComment et je ne peux pas créer un nouveau ForumTopic becuase Linq me dit que enfreint les règles ...

IQueryable<ForumTopic> query = from topic in context.ForumTopics 

           join comment in context.Comments on topic.ForumTopicId equals comment.TargetId into topicComments 
           from lastComment in topicComments.DefaultIfEmpty().OrderByDescending(c => c.CreatedDate).Take(1) 

           orderby topic.IsSticky, topic.CreatedDate descending 
           select topic; 

La requête renvoie tout correct dans SQL, cependant topic.LastComment est null.

Des idées?

Répondre

1

Le problème principal est que vous n'attribuez pas le dernier commentaire. Sans relation établie dans la base de données, il n'a aucune idée de comment remplir cet objet.

Vous allez devoir assigner manuellement le commentaire:

IQueryable<ForumTopic> query = from topic in context.ForumTopics 

orderby topic.IsSticky, topic.CreatedDate descending 
select new ForumTopic 
{ 
    ForumTopicId = topic.ForumTopicId, 
    OwnerId = topic.OwnerId, 
    // .. etc 
    LastComment = topic.Comments.OrderByDescending(c => c.CreatedDate).FirstOrDefault(); 
}; 

De toute évidence, je suppose que vous avez une relation parent-enfant entre le sujet et les commentaires. Si vous ne le faites pas, vous devriez reconsidérer la façon dont vous utilisez linq: p

+0

Comme JustLoren l'a dit, votre requête Linq est incorrecte. Je pense que la requête de JustLoren est ce dont vous pourriez avoir besoin. – MNZ

+0

J'ai: rejoindre le commentaire dans le context.Comments sur topic.ForumTopicId est égal à comment.TargetId into topicComments là, c'est la relation. Et j'ai essayé la nouvelle chose ForumTopic {} mais Linq m'a dit que c'était interdit, probablement parce que ForumTopic est un type Linq à SLQ a été mappé dans ma mapping.xml. D'autres idées? –

+0

@Brian: Je supposais que vous utilisez le concepteur L2S. Je ne suis pas familier avec l'implémentation mapping.xml. Quand je voulais dire relation, je voulais dire dans votre _schema_ pas dans votre déclaration de sélection. L'un des grands avantages de Linq est la façon dont il gère les relations d'objets et vous permet d'effectuer des requêtes à leur encontre. Je ne sais pas pourquoi votre compilateur se plaignait d'être interdit - il existe de nombreux exemples sur le web où le type L2S est instancié et rempli explicitement dans le cadre de la commande select. Est-ce que votre mapping.xml a un mapping défini pour LastComment? Si oui, qu'est-ce que c'est? – JustLoren