views:

28

answers:

1

I've been trying to get the following method cleaned up using more sensible and lean syntax, but I'm striking serious headaches when it comes to aggregate clauses and filtering using L2S. Particularly, I feel I should be able to use a .Contains() method to filter out objects whose tags fit the string parameter passed in the method, but it hasn't worked.

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;
}

It's ugly. I know it's ugly but after over 2 hours of playing with several preferred variations I still can't get it to filter the way it's supposed to. Where am I going wrong?

+1  A: 

This should be equivalent assuming there are no duplicate tags on a single Idea.

model.Ideas = ideaList.Where(
                  idea => idea.Tags.Any(
                        tag => tag.Name == Name)).ToList();
Albin Sunnanbo
Any!! That's why it wasn't working. I was all focussed on using Contains(). Thanks for this.
Phil.Wheeler
With Contains you can only match the exact element, like `tag`, not filter on a lambda expression.
Albin Sunnanbo