C# 具有Linq的实体框架实体中的相交元素

C# 具有Linq的实体框架实体中的相交元素,c#,linq,asp.net-core,entity-framework-core,C#,Linq,Asp.net Core,Entity Framework Core,我的ASP.NET Core 3.1 MVC项目中有一个名为Tag的实体框架实体,它是一个简单的模型: public class Tag { public string TagName { get; set; } public string TagNameNormalized { get; set; } public DateTime CreatedAt {get; set; } public string CreatedBy {get; set; } } 用户

我的ASP.NET Core 3.1 MVC项目中有一个名为
Tag
的实体框架实体,它是一个简单的模型:

public class Tag
{
    public string TagName { get; set; }
    public string TagNameNormalized { get; set; }
    public DateTime CreatedAt {get; set; }
    public string CreatedBy {get; set; }
}
用户可以从网站添加标签,这些标签存储在
i集合中。但我只想存储新标签,而不是重复的标签

在某个时候,我需要根据数据库中已存储的标记(
\u context
)来评估保存新添加标记的
ICollection
)。我只需要唯一的名称(
标记名
属性),其他属性可以相同

现在,我正在这样做:

ICollection<Tag> duplicateTags = _context.Tags.ToList().Intersect(tagsToCheck).ToList();
ICollection duplicateTags=\u context.Tags.ToList().Intersect(tagsToCheck.ToList();
但这可能不是我想要的,因为它将评估模型的所有属性

我应该使用哪种Linq查询,其中我只计算
标记名
属性,但仍然选择整个实体


感谢您的帮助和建议

您可以使用
linq
Join

ICollection duplicateTags=\u context.Tags.Join(
tagsToCheck,
t=>t.TagName,c=>c.TagName,
(t,c)=>t.ToList()
上面将给出重复的标记对象

另一种方式

var tagsNameToCheck = tagsToCheck.Select(t => t.TagName);
ICollection<Tag> duplicateTags = _context.Tags.Where(
                                  t => tagsNameToCheck.Contains(t.TagName))
                                  .ToList();
var tagsNameToCheck=tagsToCheck.Select(t=>t.TagName);
ICollection duplicateTags=\u context.Tags.Where(
t=>tagsnamotocheck.Contains(t.TagName))
.ToList();
请注意,
\u context.Tags.ToList()
会将数据库中的所有
标记
放入内存,如果存在大量标记,这可能会导致性能问题。建议选择第二种解决方案。

摩根

您可以使用
Distinct()
。例如:

ICollection<Tag> duplicateTags = _context.Select(t => t.TagName).Distinct().ToList()
ICollection duplicateTags=\u context.Select(t=>t.TagName).Distinct().ToList()

这是否回答了您的问题?

检查此答案,它将有助于过滤重复项
ICollection<Tag> duplicateTags = _context.Select(t => t.TagName).Distinct().ToList()