Linq按标记列表筛选帖子 公共类LogItemTag { 公共int ID{get;set;} 公共字符串标记名{get;set;} } var logItemTags=新列表(); 添加(新的LogItemTag{ID=1,TagName=“red”}); 添加(新的LogItemTag{ID=1,TagName=“green”}); 添加(新的LogItemTag{ID=3,TagName=“blue”}); 添加(新的LogItemTag{ID=3,TagName=“red”}); 添加(新的LogItemTag{ID=4,TagName=“green”}); 添加(新的LogItemTag{ID=6,TagName=“white”}); 添加(新的LogItemTag{ID=7,TagName=“red”}); 添加(新的LogItemTag{ID=7,TagName=“green”}); var listOfTagsToFilterOn=新列表{“红色”、“绿色”}; //我只需要ID 1和7的列表。 //此查询生成6个ID-1,1,3,4,7,7 var query=logItemTags.Where(lit=>listOfTagsToFilterOn.Contains(lit.TagName)).Select(lit=>lit.ID).ToList();

Linq按标记列表筛选帖子 公共类LogItemTag { 公共int ID{get;set;} 公共字符串标记名{get;set;} } var logItemTags=新列表(); 添加(新的LogItemTag{ID=1,TagName=“red”}); 添加(新的LogItemTag{ID=1,TagName=“green”}); 添加(新的LogItemTag{ID=3,TagName=“blue”}); 添加(新的LogItemTag{ID=3,TagName=“red”}); 添加(新的LogItemTag{ID=4,TagName=“green”}); 添加(新的LogItemTag{ID=6,TagName=“white”}); 添加(新的LogItemTag{ID=7,TagName=“red”}); 添加(新的LogItemTag{ID=7,TagName=“green”}); var listOfTagsToFilterOn=新列表{“红色”、“绿色”}; //我只需要ID 1和7的列表。 //此查询生成6个ID-1,1,3,4,7,7 var query=logItemTags.Where(lit=>listOfTagsToFilterOn.Contains(lit.TagName)).Select(lit=>lit.ID).ToList();,linq,Linq,使用包含扩展方法: public class LogItemTag { public int ID { get; set; } public string Tagname { get; set; } } var logItemTags = new List<LogItemTag>(); logItemTags.Add(new LogItemTag { ID = 1, TagName = "red" }); logItemTags.Add(new LogItemTag

使用
包含
扩展方法:

public class LogItemTag
{
    public int ID { get; set; }
    public string Tagname { get; set; }
}

var logItemTags = new List<LogItemTag>();
logItemTags.Add(new LogItemTag { ID = 1, TagName = "red" });
logItemTags.Add(new LogItemTag { ID = 1, TagName = "green" });
logItemTags.Add(new LogItemTag { ID = 3, TagName = "blue" });
logItemTags.Add(new LogItemTag { ID = 3, TagName = "red" });
logItemTags.Add(new LogItemTag { ID = 4, TagName = "green" });
logItemTags.Add(new LogItemTag { ID = 6, TagName = "white" });
logItemTags.Add(new LogItemTag { ID = 7, TagName = "red" });
logItemTags.Add(new LogItemTag { ID = 7, TagName = "green" });

var listOfTagsToFilterOn = new List<string> {"red", "green" };

//I need a list of ids 1 and 7 only.

//this query produces 6 ids - 1,1,3,4,7,7
var query = logItemTags.Where(lit => listOfTagsToFilterOn.Contains(lit.TagName)).Select(lit => lit.ID).ToList();
使用扩展方法

var query=LogItemTagList.Where(l=>tags.Contains(l.Tagname))
                        .GroupBy(l=>l.ID)
                        .Where(g=>g.Count==tags.Count)
                        .Select(g=>g.Key)
                        .ToList();
var filterList=new[]{“红色”、“绿色”};
变量列表=新列表
{
新的LogItemTag{ID=1;TagName=“green”},
....
};
var filteredIds=list.Where(i=>filterList.Contains(i.TagName)
.Select(f=>f.ID).ToList();
更新

var filterList = new [] {"red", "green"};
var list = new List<LogItemTag>
       {
             new LogItemTag {ID =1; TagName = "green"},
             ....
       };

var filteredIds = list.Where(i => filterList.Contains(i.TagName)
                  .Select(f => f.ID).ToList();
List logItemTags=new List();
添加(新的LogItemTag{ID=1,TagName=“red”});
添加(新的LogItemTag{ID=1,TagName=“green”});
添加(新的LogItemTag{ID=3,TagName=“blue”});
添加(新的LogItemTag{ID=3,TagName=“red”});
添加(新的LogItemTag{ID=4,TagName=“green”});
添加(新的LogItemTag{ID=6,TagName=“white”});
添加(新的LogItemTag{ID=7,TagName=“red”});
添加(新的LogItemTag{ID=7,TagName=“green”});
var listOfTagsToFilterOn=新列表{“红色”、“绿色”};
var filteredList=logItemTags.Where(l=>listOfTagsToFilterOn.Contains(l.TagName))
.GroupBy(l=>l.ID,
l=>l.TagName,
(k,t)=>new{Id=k,Count=t.Distinct().Count()})
.Where(d=>d.Count==listOfTagsToFilterOn.Count())
.Select(d=>d.Id).ToList();
这里有一些解释


首先,我们按ID对数据进行分组,并生成具有ID和不同标记计数的匿名类型的对象。然后过滤它们以匹配标记计数以过滤标记计数。如果您将同一标记设置为sme ID,这将起作用。

这就是我要做的。请随意编辑/优化它

List<LogItemTag> logItemTags = new List<LogItemTag>();
logItemTags.Add(new LogItemTag { ID = 1, TagName = "red" });
logItemTags.Add(new LogItemTag { ID = 1, TagName = "green" });
logItemTags.Add(new LogItemTag { ID = 3, TagName = "blue" });
logItemTags.Add(new LogItemTag { ID = 3, TagName = "red" });
logItemTags.Add(new LogItemTag { ID = 4, TagName = "green" });
logItemTags.Add(new LogItemTag { ID = 6, TagName = "white" });
logItemTags.Add(new LogItemTag { ID = 7, TagName = "red" });
logItemTags.Add(new LogItemTag { ID = 7, TagName = "green" });

var listOfTagsToFilterOn = new List<string> {"red", "green" };

var filteredList = logItemTags.Where(l => listOfTagsToFilterOn.Contains(l.TagName))
    .GroupBy(l => l.ID,
             l => l.TagName,
             (k, t) => new {Id = k, Count = t.Distinct().Count()})
    .Where(d => d.Count == listOfTagsToFilterOn.Count())
    .Select(d => d.Id).ToList();
var logItemTags=new List();
添加(新的LogItemTag{ID=1,TagName=“red”});
添加(新的LogItemTag{ID=1,TagName=“green”});
添加(新的LogItemTag{ID=3,TagName=“blue”});
添加(新的LogItemTag{ID=3,TagName=“red”});
添加(新的LogItemTag{ID=4,TagName=“green”});
添加(新的LogItemTag{ID=6,TagName=“white”});
添加(新的LogItemTag{ID=7,TagName=“red”});
添加(新的LogItemTag{ID=7,TagName=“green”});
var listOfTagsToFilterOn=新列表{“红色”、“绿色”};
var list=logItemTags.Where(
x=>listOfTagsToFilterOn.All(
y=>logItemTags.Any(
z=>z.ID==x.ID&&y.TagName==z.TagName)))
.Select(x=>x.ID).Distinct();

选择通过所有过滤器的所有ID(其中项目具有所有标记名)

这将生成一个包含1、5和6的列表。因此它是包容性的,而不是过滤。唯一同时包含1和6的ID是hamlet谢谢您的帮助。现在我有3个解决方案。谢谢,请参阅hamlet的评论post@octaviocci谢谢。我只想看到同时有红色和绿色的登录项。不是红色或绿色的。谢谢你的帮助。@Terrence,但这是你问的另一个问题,请你澄清一下你想要实现什么?
LogItem
是你模型的另一个类,它有一个
LogItemTags
,对吗?@Terrence,我想现在我明白你想要实现什么了,看看Octaviocci谢谢你的帮助。这就是我想要的我正在寻找。我如何将你的答案标记为正确答案?Etienne谢谢你的帮助,这个linq非常有效。
List<LogItemTag> logItemTags = new List<LogItemTag>();
logItemTags.Add(new LogItemTag { ID = 1, TagName = "red" });
logItemTags.Add(new LogItemTag { ID = 1, TagName = "green" });
logItemTags.Add(new LogItemTag { ID = 3, TagName = "blue" });
logItemTags.Add(new LogItemTag { ID = 3, TagName = "red" });
logItemTags.Add(new LogItemTag { ID = 4, TagName = "green" });
logItemTags.Add(new LogItemTag { ID = 6, TagName = "white" });
logItemTags.Add(new LogItemTag { ID = 7, TagName = "red" });
logItemTags.Add(new LogItemTag { ID = 7, TagName = "green" });

var listOfTagsToFilterOn = new List<string> {"red", "green" };

var filteredList = logItemTags.Where(l => listOfTagsToFilterOn.Contains(l.TagName))
    .GroupBy(l => l.ID,
             l => l.TagName,
             (k, t) => new {Id = k, Count = t.Distinct().Count()})
    .Where(d => d.Count == listOfTagsToFilterOn.Count())
    .Select(d => d.Id).ToList();
var logItemTags = new List<LogItemTag>();
logItemTags.Add(new LogItemTag { ID = 1, TagName = "red" });
logItemTags.Add(new LogItemTag { ID = 1, TagName = "green" });
logItemTags.Add(new LogItemTag { ID = 3, TagName = "blue" });
logItemTags.Add(new LogItemTag { ID = 3, TagName = "red" });
logItemTags.Add(new LogItemTag { ID = 4, TagName = "green" });
logItemTags.Add(new LogItemTag { ID = 6, TagName = "white" });
logItemTags.Add(new LogItemTag { ID = 7, TagName = "red" });
logItemTags.Add(new LogItemTag { ID = 7, TagName = "green" });

var listOfTagsToFilterOn = new List<string> {"red", "green" };

var list = logItemTags.Where(
    x => listOfTagsToFilterOn.All(
    y => logItemTags.Any(
    z => z.ID == x.ID && y.TagName == z.TagName)))
    .Select(x => x.ID).Distinct();