Использование Join для получения обновленной Entity Framework Table Linq - PullRequest
0 голосов
/ 01 марта 2019

Попытка соединения с использованием 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;

Я надеюсь, что кто-то может порекомендовать менячто использовать или что делать.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Я бы пошел на внутреннее соединение с .Join():

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

В качестве примечания, есть ли причина, по которой ваша вторая таблица содержит ApplicantName?Почему бы не оставить это только в таблице «Кандидат»?

РЕДАКТИРОВАТЬ: Перечитав вопрос, я понял, что вам также нужны непревзойденные записи из левого списка.Таким образом, это должно быть left outer join вместо этого, чего вы достигнете с .GroupJoin() и .SelectMany():

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
*/
0 голосов
/ 01 марта 2019

Это странная структура для отображения.Конструктивно это выглядит как 1 к 0, 1, но в принципе это выглядит как 1 к многим.Для 1-ко-многим я бы ожидал, что структура таблицы будет больше похожа на:

Заявитель (ApplicantId | Имя)

ApplicantNote (ApplicantNoteId | ApplicantId | Примечание)

Это будет отображено в 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);
    }
}

То, что у вас есть, больше похоже на таблицу «Заявитель», которая содержит примечание, но тогда есть дополнительнаятаблица, которая может содержать одну дополнительную дополнительную заметку.

Заявитель (ApplicantId | Имя | Примечание)

ExtraApplicantNote (ApplicantId | Примечание) // Имя не требуется.

, который в 1-к-0.1 будет выглядеть примерно так:

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);
    }
}

Это присоединяет эту дополнительную запись заметки кандидата к заявителю какнеобязательный связанный объект.При выборе в качестве графа сущностей:

var applicant = context.Applicants
    .Include(x => x.ExtraApplicantNote)
    .Single(x => x.ApplicantId == applicantId);

, например ..., затем получите доступ к заметкам через applicant.Note и applicant?.ExtraApplicantNote.Note, чтобы учесть тот факт, что дополнительная заметка кандидата является необязательной.

Чтобы получить выходные данные всех заметок с указанием их сведений о заявителе, создать структуру 1-ко-многим гораздо проще:

var notes = context.ApplicantNotes.Select(x => new 
  {
    x.Applicant.ApplicantId,
    x.Applicant.Name,
    x.Note
  }).ToList();

Чтобы сделать то же самое с 1-to-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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...