C# 如何在林克的哪里做
所以我有一个Blog对象,它有一个标记对象列表(C# 如何在林克的哪里做,c#,linq,C#,Linq,所以我有一个Blog对象,它有一个标记对象列表(list) 我正在尝试创建一个方法,该方法获取标记列表并返回包含传入列表中所有标记的博客列表 我能够创建一个方法,如果它匹配一个标记,则返回一个博客列表,但不返回标记列表 要做到这一点,我有这个 entities.Blogs.Where(b => b.Tags.Any(t => t.Name == tagName)) 但我不知道怎么做这样的事 entities.Blogs.Where(b => b.Tags.Any(t =>
list
)
我正在尝试创建一个方法,该方法获取标记列表并返回包含传入列表中所有标记的博客列表
我能够创建一个方法,如果它匹配一个标记,则返回一个博客列表,但不返回标记列表
要做到这一点,我有这个
entities.Blogs.Where(b => b.Tags.Any(t => t.Name == tagName))
但我不知道怎么做这样的事
entities.Blogs.Where(b => b.Tags.Any(t => t.Name == tags[0] AND t.Name == tags[1] AND t.Name == tags[2] etc.......))
有没有办法做到这一点
谢谢大家!
从逻辑上讲,我使用LINQ来创建实体,我认为您需要类似以下内容:
entities.Blogs.Where(b => tags.All(t => b.Tags.Any(bt => bt.Name == t)))
或者:
HashSet<string> tagNames = new HashSet<string>(tags);
return entities.Blogs
.Where(b => tagNames.IsSubsetOf(b.Tags.Select(x => x.Name)));
HashSet标记名=新的HashSet(标记);
返回实体。博客
。其中(b=>tagNames.IsSubsetOf(b.Tags.Select(x=>x.Name));
如果这是使用LINQ到实体,我怀疑这会起作用-但如果您只是使用LINQ到对象,它应该会起作用。即使这样,它也不会非常有效。我怀疑有一种更有效的做事方式,但我不能马上想到。。。感觉上你想要加入,但随后又变得棘手。你可以这样做:
List<Tag> tags = GetTags...;
IQueryable<Blog> blogs = entities.Blogs; // start with all
foreach(var tag in tags){
var thisTag = tag; //this is needed to prevent a bug
blogs = blogs.Where(entry=>entry.Tags.Any(entryTag=>entryTag.TagId==thisTag.TagId));
}
return blogs.OrderBy....;
List tags=GetTags。。。;
IQueryable blogs=entities.blogs;//从所有开始
foreach(标签中的var标签){
var thisTag=tag;//这是防止bug所必需的
blogs=blogs.Where(entry=>entry.Tags.Any(entryTag=>entryTag.TagId==thisTag.TagId));
}
返回blogs.OrderBy。。。。;
这将把Where子句链接在一起,要求所有标记都存在,以便返回博客条目。您的意思是说您正在查找至少包含标记数组中一个标记的博客吗?或者您正在尝试查找包含tags数组中所有标记的博客?我认为这将使它只返回包含与传入列表中的所有标记匹配的标记的内容。我正在尝试查找包含tags数组中所有标记的博客。您能否澄清您是否正在使用LINQ访问对象,林克:实体等等?乔恩·斯基特就是那个人!谢谢你。第一个选择效果很好。