【问题标题】:Intersecting elements in Entity Framework entities with LinqEntity Framework 实体中的元素与 Linq 相交
【发布时间】:2021-04-15 02:38:46
【问题描述】:

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

public class Tag
{
    public string TagName { get; set; }
    public string TagNameNormalized { get; set; }
    public DateTime CreatedAt {get; set; }
    public string CreatedBy {get; set; }
}

用户可以从网站添加标签,这些标签存储在ICollection<Tag> 中。但我只想存储新标签,而不是重复的。

在某些时候,我需要评估包含新添加标签的ICollection 与已存储在数据库中的标签 (_context)。我只想要唯一的名称(TagName 属性),其他属性可以相同。

现在,我正在这样做:

ICollection<Tag> duplicateTags = _context.Tags.ToList().Intersect(tagsToCheck).ToList();

但这可能不是我想要的,因为它会评估模型的所有属性。

我应该使用哪种 Linq 查询,我只评估 TagName 属性,但仍然选择整个实体?

感谢任何帮助和建议!

【问题讨论】:

标签: c# linq asp.net-core entity-framework-core


【解决方案1】:

你可以使用linq加入

ICollection<Tag> duplicateTags = _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();

请注意_context.Tags.ToList() 会将所有tags 从数据库带入内存,如果有许多标签,这可能是您的情况下的性能问题。建议选择第二种解决方案。

【讨论】:

    【解决方案2】:

    摩根,

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

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

    这能回答你的问题吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-10
      • 2014-07-22
      相关资源
      最近更新 更多