我有一个过滤器列表,我想用它来查询一个表,其中返回的项目包含所有值,而不只是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。
因此,数据库中的示例数据将是:
野马队有运动和足球标签 大都会队有运动和棒球标签
我希望拥有运动和足球标签的球队,而不是运动或橄榄球标签。
答案 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();
这应该有助于获得理想的结果