C# 具有Linq的实体框架实体中的相交元素
我的ASP.NET Core 3.1 MVC项目中有一个名为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; } } 用户
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()