Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 使用Join获取更新的表Linq实体框架_Entity Framework_Linq_Asp.net Mvc 3 - Fatal编程技术网

Entity framework 使用Join获取更新的表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

尝试使用Linq加入。我应该用什么?左连接还是右连接

    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
*/