linq其中包含列表中的所有项目

时间:2015-03-18 16:52:10

标签: c# .net linq

我有一个过滤器列表,我想用它来查询一个表,其中返回的项目包含所有值,而不只是1。

例如,我有一个标签/标签系统。我想返回标记为'sport'和'football'的记录。然而,“运动”和“足球”存储在列表中,可以是用户提供的任意数量的其他标签。

我正在使用实体框架。我有一个标签,团队,TeamTags表。我当前的查询是这样的:

string _tags = "sport,football";
List<string> tags = _tags.Split(',').ToList();

var teams = (from t in db.Tags where tags.Contains(t.TagName) select t.Teams).FirstOrDefault().Select(i => i.TeamNames).ToList()

但是这将使所有拥有'sport'标签的球队不再仅仅被标记为'sports'和'football'的球队。

如果您想先输入'sport'标签,您将获得所有体育项目的球队列表。然后你添加'足球'标签,列表将被更多地过滤到足球队。所以我上面的代码基本上在哪里做了OR。我也希望能够做一个AND。

因此,数据库中的示例数据将是:

野马队有运动和足球标签 大都会队有运动和棒球标签

我希望拥有运动和足球标签的球队,而不是运动或橄榄球标签。

2 个答案:

答案 0 :(得分:10)

我建议尝试一下:

var teams = (from team in db.Teams 
             where tags.All(tag => team.Tags.Any(ttag => ttag.TagName == tag))
             select team).ToList();

从那里,如果你想要一个名单列表,你可以对它做一个预测(很难完全了解你的数据结构如何设置,但是这样的事情):

var teamNames = teams.Select(t => t.Name).ToList();

答案 1 :(得分:0)

string _tags = "sport,football";
List<string> tags = _tags.Split(',').ToList();

var teams = (from t in db.Tags where tags.All(x=> x.Contains(t.TagName)) select t.Teams).FirstOrDefault().Select(i => i.TeamNames).ToList();

这应该有助于获得理想的结果