C# 查找列表和db表之间的重复项
我想用1db调用查找列表和db表之间的重复值。该列表包含1000多行,db表包含100k多行。可能吗 列表结构:C# 查找列表和db表之间的重复项,c#,entity-framework,linq,C#,Entity Framework,Linq,我想用1db调用查找列表和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
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.investments
中有100k+行。我可以在一次通话中检查重复的电子邮件(存在于db和列表变量中的电子邮件)吗?或者最好的方法是什么?关于电子邮件的副本:
var lst = batchInvites.Candidate.Select(y => y.Email);
db.Invitations
.Where(x => lst.Contains(x.Email))
.ToList();
您如何定义“重复”,相同的面试ID或相同的姓名或相同的邮件或两者?仅相同的邮件。可以通过1个db呼叫完成,但速度非常慢,因为候选邮件(1000多条记录)。我建议在列表的电子邮件中循环,这意味着1000+分贝的呼叫,但它要快得多。是的,它看起来真的很慢。我试过@rad的答案。我在
.Where()
之前使用了.AsEnumerable()
,这意味着交叉匹配应该发生在内存中。但目前该列表包含1058条记录,db包含315行。每次大约需要9秒。你能解释一下吗?一个小错误.AsEnumerable()
在Where()
之前是必需的。但是它真的很慢。@WahidMasud:如果添加AsNumerable,尽管它只通过一个db调用执行查询,但它会将整个邀请表读取到RAM中,这是一个性能问题(这就是为什么它很慢)。但是,如果它是可查询的,它只读取所需的数据,并且仍然只使用一个db调用然后我得到这个错误无法创建类型Application.Dto的常量值。在这个上下文中只支持基本类型或枚举类型
这个答案解释了@mjwills这个查询将所有1058封电子邮件放在Where
子句中。从您提供的链接来看,它说最大参数号可以是2100。这就是你指的问题吗?我再次尝试了3175封电子邮件,结果它成功了。Awesome@WahidMasud-我很惊讶它能成功(因为有2100多个参数)。但很高兴听到这样的消息!