2010-10-28 2 views
0

Я пытаюсь очистить следующий метод, используя более разумный и худой синтаксис, но я поражаю серьезными головными болями, когда речь идет о агрегатных предложениях и фильтрации с использованием L2S. В частности, я считаю, что должен использовать метод .Contains() для фильтрации объектов, чьи теги соответствуют параметру строки, переданному в методе, но он не сработал.Логическая ошибка 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; 
} 

Это некрасиво. Я знаю, что это уродливо, но после более чем двух часов игры с несколькими предпочтительными вариантами я до сих пор не могу заставить его фильтровать то, как он должен был. Где я иду не так?

ответ

2

Это должно быть эквивалентно, если в одной идее нет повторяющихся тегов.

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

Любые !! Вот почему он не работал. Я был сосредоточен на использовании Contains(). Спасибо за это. –

+0

С Содержаниями вы можете соответствовать только точному элементу, например 'tag', а не фильтровать по выражению лямбда. –

Смежные вопросы