【问题标题】:Find duplicates between a list and a db table查找列表和数据库表之间的重复项
【发布时间】:2019-02-23 07:31:33
【问题描述】:

我想通过 1 个 db 调用查找列表和 db 表之间的重复值。该列表包含 1000+ 行,而 db 表包含 100k+ 行。是否可以?

列表结构:

public class BatchInvitationDto
{
    public List<Candidates> Candidate { get; set; }
    public string InterviewId { get; set; }
}

public class Candidates
{
    public string Name { get; set; }
    public string Email { get; set; }
}  

和数据库结构:

public class Invitations
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [Required(ErrorMessage = "Interview ID is required")]
    public int InterviewId { get; set; }  

    [Required(ErrorMessage = "Candidate Name is Required")]
    public string CandidateName { get; set; }

    [Required(ErrorMessage = "Candidate Email is Required")]
    public string CandidateEmail { get; set; }

    [StringLength(450)]
    [Index(IsUnique = true)]
    public string Guid { get; set; }

}  

现在我的列表中有 1000 多行

BatchInvitationDto batchInvites = new BatchInvitationDto(); 
batchInvites.Candidate  // contains 1000+ rows  

我在 db 表 context.Invitations 中有 100k+ 行。我可以一次调用检查重复的电子邮件(数据库和列表变量中都存在的电子邮件)吗?或者最好的方法是什么?

【问题讨论】:

  • 如何定义“重复”、相同的 InterviewId 或相同的 Name 或相同的 Mail 或两者兼而有之?
  • 仅限同一电子邮件。
  • 它可以通过 1 db 调用来完成,但会非常慢,其中 CandidateEmail 在(1000+ 条记录)。我建议在列表的电子邮件中循环,这意味着 1000+ db 调用,但它更快。
  • 是的,它看起来真的很慢。我尝试了@rad 的答案。我在.Where() 之前使用了.AsEnumerable(),这意味着交叉匹配应该发生在内存中。但目前该列表包含 1058 条记录,db 包含 315 行。每次大约需要 9 秒。你能解释一下吗?

标签: c# entity-framework linq


【解决方案1】:

关于电子邮件的重复:

var lst = batchInvites.Candidate.Select(y => y.Email);
db.Invitations
    .Where(x => lst.Contains(x.Email))
    .ToList();

【讨论】:

  • 一个小错误。 .AsEnumerable() 必须在 Where() 之前。但它真的很慢。
  • @WahidMasud:如果添加 AsNumerable,虽然它只通过一个 db 调用执行查询,但它会将整个 Invitations 表读入 RAM,这是一个性能问题(这就是它很慢的原因)。但是,如果它是可查询的,它只会读取所需的数据,并且仍将只使用一个 db 调用。
  • 如果我不使用AsEnumerable() 那么我会收到此错误Unable to create a constant value of type Application.Dto.Candidates Only primitive types or enumeration types are supported in this context 这个答案解释了stackoverflow.com/questions/18929483/…
  • @mjwills 此查询将所有 1058 封电子邮件放在 Where 子句中。从您提供的链接中,它说最大参数数可以是 2100。这是您指向的问题吗?我再次尝试了 3175 封电子邮件,它成功了。
  • 真棒@WahidMasud - 我很惊讶它的工作原理(因为有超过 2100 个参数)。但很高兴听到它!
猜你喜欢
  • 1970-01-01
  • 2020-10-17
  • 2020-01-03
  • 1970-01-01
  • 1970-01-01
  • 2017-05-17
  • 2018-05-18
  • 2020-02-01
  • 1970-01-01
相关资源
最近更新 更多