Entity framework 使用Join获取更新的表Linq实体框架
尝试使用Linq加入。我应该用什么?左连接还是右连接Entity framework 使用Join获取更新的表Linq实体框架,entity-framework,linq,asp.net-mvc-3,Entity Framework,Linq,Asp.net Mvc 3,尝试使用Linq加入。我应该用什么?左连接还是右连接 FIRST LIST SECOND LIST APPLICANT_ID|Applicant_Name| NOTES | |APPLICANT_ID|Applicant_Name | NOTES | 1 | RAY HEAVENS | Note1 | | 2 | BEN TULFO | NoteA 2
FIRST LIST SECOND LIST
APPLICANT_ID|Applicant_Name| NOTES | |APPLICANT_ID|Applicant_Name | NOTES |
1 | RAY HEAVENS | Note1 | | 2 | BEN TULFO | NoteA
2 | BEN TULFO | Note2 | | 3 | ERNIE BARON | NoteB
3 | ERNIE BARON | Note3 | |
4 | SUPERMAN | Note4 | |
5 | MARK LAPID | Note5 | |
期望输出:
APPLICANT_ID | Applicant_Name | NOTES
-------------+----------------+---------
1 | RAY HEAVENS | Note1
2 | BEN TULFO | NoteA
3 | ERNIE BARON | NoteB
4 | SUPERMAN | Note4
5 | MARK LAPID | Note5
这是我在控制器中的代码:
var applicantList = (from a in db.Profiles
where a.isDeleted == false
select a ).ToList();
var GetNewNotes = (from a in db.ProfilesNotes
where a.isDeleted == false
select a).ToList();
var lst = (from lst1 in applicantList
where !GetNewNotes.Any(x => x.APPLICANT_ID == lst1.APPLICANT_ID )
select lst1).ToList();
ViewBag.updatedNotes = lst;
我希望有人能推荐我使用什么或做什么
提前谢谢。这是一个奇怪的结构图。从结构上看,它看起来像1对0..1,但从概念上看,它应该是1对多。对于一对多,我希望表结构更像: 申请人(申请人姓名) 应用程序注释(应用程序注释ID |应用程序ID |注释) 这将映射到EF中,类似于:
public class Applicant
{
public int ApplicantId { get; set; }
public string Name { get; set; }
public virtual ICollection<ApplicantNote> { get; set; } = new List<ApplicantNote>();
}
public class ApplicantNote
{
public int ApplicantNoteId { get; set; }
public virtual Applicant Applicant { get; set; }
}
public class ApplicantConfig : EntityTypeConfiguration<Applicant>
{
public ApplicantConfig()
{
ToTable("Applicant");
HasKey(x => x.ApplicantId);
HasMany(x => x.ApplicantNotes)
.WithRequired(x => x.Applicant)
.Map(x => x.MapKey("ApplicantId"));
}
}
public class ApplicantNoteConfig : EntityTypeConfiguration<ApplicantNote>
{
public ApplicantNoteConfig()
{
ToTable("ApplicantNote");
HasKey(x => x.ApplicantNoteId);
}
}
public class Applicant
{
public int ApplicantId { get; set; }
public string Name { get; set; }
public string Note { get; set; }
public ExtraApplicantNote ExtraApplicantNote { get; set; }
}
public class ExtraApplicantNote
{
public int ApplicantId { get; set; }
public string Note { get; set; }
public virtual Applicant Applicant { get; set; }
}
public class ApplicantConfig : EntityTypeConfiguration<Applicant>
{
public ApplicantConfig()
{
ToTable("Applicant");
HasKey(x => x.ApplicantId);
HasOptional(x => x.ExtraApplicantNote)
.WithRequired(x => x.Applicant);
}
}
public class ExtraApplicantNoteConfig : EntityTypeConfiguration<ExtraApplicantNote>
{
public ExtraApplicantNoteConfig()
{
ToTable("ExtraApplicantNote");
HasKey(x => x.ApplicantId);
}
}
例如。。。然后通过applicator.note
和applicator?.extraapplicationnote.note
访问备注,说明额外的申请人备注是可选的
要生成包含申请者详细信息的所有票据的输出,1对多结构要简单得多:
var notes = context.ApplicantNotes.Select(x => new
{
x.Applicant.ApplicantId,
x.Applicant.Name,
x.Note
}).ToList();
用1比0做同样的事情。1更复杂一些:
var notes = context.Applicants.Select(x => new
{
x.ApplicantId,
x.Name,
x.Note
}).Union(context.ExtraApplicantNotes.Select(x => new
{
x.ApplicantId,
x.Applicant.Name,
x.Note
})).ToList();
这涉及到首先从第一个表中提取注释,然后使用并集从第二个表中的可选记录中连接相同的细节
**编辑**对不起,我重新阅读了问题,您希望第二个表覆盖第一个表
在这种情况下,与上述类似:
var notes = context.ExtraApplicantNotes.Select(x => new
{
x.ApplicantId,
x.Applicant.Name,
x.Note
}).Union(context.Applicants
.Where(x => x.ExtraApplicant == null)
.Select(x => new
{
x.ApplicantId,
x.Name,
x.Note
})).ToList();
我会使用.join()
进行内部联接:
作为旁注,您的第二个表包含applicationname
有什么原因吗?
为什么不把它只放在申请表中
编辑:
在重新阅读了这个问题之后,我意识到您需要从左侧列表中找到不匹配的条目
也因此,这应该是左外部联接
,这是通过.GroupJoin()
和实现的
哈哈哈。。观察得不错,先生。我刚刚添加了更多信息的专栏。正如你所看到的,你可以通过加入获得这些信息D如果getNewnotes的值比申请人列表的值多,例如,applicationList
中的3个申请人列表和getNewnotes
中的5个申请人列表,那么会发生什么情况。它会输出5行吗??或者仅仅是申请表上的3个?先生,输出是什么?这取决于具体情况。由于这是一个内部联接,因此将丢弃两个列表中不匹配的元素。如果在任何列表中有匹配的重复键,并且它们匹配,这些键也将被放入结果中。谢谢您的解释。我只想问一下,如果getNewnotes
中的值比申请人列表中的值多,例如applicationlist
中的3个申请人列表和getNewnotes
中的5个申请人列表,会发生什么情况。它会输出5行吗??或者仅仅是应用程序列表
上的3个?我相信您正在寻找最后一个编辑,尽管有2个具有类似列的未关联表,您应该仍然能够使用Union方法,并且它将返回5行。鉴于申请人的3个身份证也出现在新的笔记中。先生,谢谢。顺便说一句,你所说的`.Where(x=>x.extraapplicator==null)
在你的上一次编辑中,这将在两个实体之间建立一个关系,从0..1配置“`HasOptional(x=>x.extraapplicationnote).with required(x=>x.application)`即使它们不是直接相关的,但它们共享主键,因此可以设置此关系,以便获得第二个表,并且只有第一个表记录,其中它们没有第二个表关联。(使用B加上任何没有匹配B的a)
var notes = context.ExtraApplicantNotes.Select(x => new
{
x.ApplicantId,
x.Applicant.Name,
x.Note
}).Union(context.Applicants
.Where(x => x.ExtraApplicant == null)
.Select(x => new
{
x.ApplicantId,
x.Name,
x.Note
})).ToList();
var lst = applicantList.Join(GetNewNotes,
(a) => a.APPLICANT_ID,
(n) => n.APPLICANT_ID,
(a, n) => return new
{
a.APPLICANT_ID,
a.Applicant_Name,
n.Notes
});
/*
lst:
2 | BEN TULFO | NoteA,
3 | ERNIE BARON | NoteB
*/
var lst = applicantList.GroupJoin(GetNewNotes,
(a) => a.Id,
(n) => n.Id,
(a, n) => new
{
Id = a.Id,
Name = a.Name,
Notes = a.Notes,
ApplicantNotes = n
})
.SelectMany(
g => g.ApplicantNotes.DefaultIfEmpty(),
(g, applicantNotes) => new
{
Id = g.Id,
Name = g.Name,
Notes = applicantNotes?.Notes ?? g.Notes
});
/*
lst:
1 | RAY HEAVENS | Note1
2 | BEN TULFO | NoteA
3 | ERNIE BARON | NoteB
4 | SUPERMAN | Note4
5 | MARK LAPID | Note5
*/