2010-10-28 5 views
0

J'ai essayé de faire nettoyer la méthode suivante en utilisant une syntaxe plus sensible et plus légère, mais je suis confronté à de sérieux casse-tête en termes de clauses agrégées et de filtrage utilisant L2S. En particulier, je pense que je devrais être en mesure d'utiliser une méthode .Contains() pour filtrer les objets dont les balises correspondent au paramètre string passé dans la méthode, mais cela n'a pas fonctionné.Douleur logique linq-to-sql

public TagListViewModel GetTagModel(string Name) 
{ 
    var model = new TagListViewModel(); 

    var repo = new SimpleRepository("Wishlist"); 

    var ideas = repo.All<Idea>(); 

    List<Idea> ideaList = new List<Idea>(); 

    foreach (Idea i in ideas) 
    { 
     var query = from tag in repo.All<Tag>() 
        join ideatag in repo.All<IdeaTag>() 
        on tag.ID equals ideatag.TagId 
        where ideatag.IdeaId == i.ID 
        select tag; 
     i.Tags = query.ToList<Tag>(); 

      ideaList.Add(i); 
    } 

    foreach (Idea i in ideaList) 
    { 
     var query = from vote in repo.All<IdeaVotes>() 
        where vote.IdeaId == i.ID 
        select vote; 

     i.Votes = query.ToList<IdeaVotes>(); 
    } 

    // Here begins the problem area. I should be able to get a tag from the repo 
    // whose name matches the "Name" parameter and then call a .Contains() method to 
    // filter this list, shouldn't I? 
    List<Idea> filteredTagList = new List<Idea>(); 
    foreach (Idea item in ideaList){ 
     foreach(Tag t in item.Tags) 
     { 
      if (t.Name == Name) 
       filteredTagList.Add(item); 
     } 
    } 

    model.Ideas = filteredTagList; 

    return model; 
} 

C'est moche. Je sais que c'est moche mais après plus de 2 heures de jeu avec plusieurs variations préférées, je n'arrive toujours pas à le filtrer comme il le devrait. Où vais-je mal?

Répondre

2

Cela devrait être équivalent en supposant qu'il n'y a pas de balises en double sur une seule idée.

model.Ideas = ideaList.Where(
        idea => idea.Tags.Any(
         tag => tag.Name == Name)).ToList(); 
+0

Tout !! Voilà pourquoi ça ne fonctionnait pas. J'étais concentré sur l'utilisation de Contains(). Merci pour cela. –

+0

Avec Contains, vous ne pouvez faire correspondre que l'élément exact, comme 'tag', sans filtre sur une expression lambda. –