Как использовать соединение linq между несвязанными моделями? (один из них - IdentityUser) - PullRequest
0 голосов
/ 06 августа 2020

Я использую asp. net core EF. У меня две модели. [1] первый - это сотрудник, который наследует IdentityUser и расширяет его. [2] второй - DocumentIn, у которого есть ключ сотрудника

примечание: они не связаны

проблема: Мне нужно просмотреть весь DocumentIn, но с именами сотрудников, а не с ключами

следующие две мои модели соответственно (с комментариями, включенными для демонстрации первичных и внешних ключей)

Сотрудник, наследующий от IdentityUser

public class Employee: IdentityUser
{
    // this primary key (Id) is identified as a foreign key twice in the next model (Document In) 
    // but with different names 
    // the names are [EmpFrom] and [EmpTo]
    [Key] 
    public override string Id { get => base.Id; set => base.Id = value; }
    //-------------------------------------------------------------------------------------------

    [EmailAddress]
    public override string Email { get => base.Email; set => base.Email = value; }

    public string HomePhone { get; set; }

    public string EmpName { get; set; }

    public int? DivID { get; set; }
    [ForeignKey("DivID")]
    public Division division { get; set; }

    public string Password { get; set; }

    [NotMapped]
    public string ConfirmPassword { get; set; }

}

DocumentIn

public class DocumentIn
{
    [Key]
    public int DocInID { get; set; }

    public string DocName { get; set; } 
    public string Notes { get; set; }
    public string BarCode { get; set; }

    public DateTime ActionDate { get; set; } 
    public DateTime DueDate { get; set; } 

    // here I use these names to contains employees Id which is GUID of IdentityUser
    public string EmpFrom { get; set; } 
    public string EmpTo { get; set; } 

}

Важно:

Я использую EF концепция, DbContext для получения DocumentIn однако я использую UserManager, с другой стороны, чтобы получить сотрудников

, как показано ниже

gitting DocumentIn с использованием _context

// _TableView is a ViewModel which has this attripute 
// public List<DocumentIn> DocumentsInList { get; set; }

_TableView.DocumentsInList = await _context.DocumentIn.Where(bla bla bla).ToListAsync();

создание сотрудников с помощью UserManager

 List<Employee> Emps = await userManager.Users.ToListAsync();

Теперь мне нужно включить Emp с запросом DocumentsInList, чтобы читать все документы с именами сотрудников, а не с их идентификаторами. Другими словами, мне нужно просмотреть EmpName из Employee, а не EmpFrom и EmpTo в приведенном выше запросе LINQ.

Я уже сделал следующий запрос LINQ, но я не знаю, как заменить EmpFrom и EmpTo из DocumentIn на EmpName от сотрудника

  // -------- all users 
  List<Employee> Emps = await userManager.Users.ToListAsync();

  _TableView.DocumentsInList = await _context.DocumentIn.Include(e => Emps).ToListAsync();

Ответы [ 2 ]

0 голосов
/ 06 августа 2020

Я уже сделал следующий запрос LINQ, но я не знаю, как заменить EmpFrom и EmpTo из DocumentIn на EmpName из Employee

Согласно коду вашей модели, поскольку модель DecumentIn не содержит ссылочного свойства навигации для сотрудника, если вы хотите отображать сотрудника при запросе таблицы DecumentIn, вы должны использовать предложение Join.

И вы можете создать модель представления (например, : DocumentInViewModel), который содержит свойство EmpName, то в предложении LINQ select вы можете создать экземпляр DocumentInViewModel и отобразить имя сотрудника.

Код, как показано ниже (предположим, что значение EmpFrom DocumentIn равно значению идентификатора Emplyee):

public class DocumentInViewModel
{ 
    public int DocInID { get; set; }

    public string DocName { get; set; } 
    public string Notes { get; set; }
    public string BarCode { get; set; }

    public DateTime ActionDate { get; set; } 
    public DateTime DueDate { get; set; } 

    // used to display the Employee Name.
    public string EmpName { get; set; }  

}

Затем вы можете попробовать использовать следующий код для запроса связанных данных.

        List<Employee> Emps = await userManager.Users.ToListAsync();
        var resultee = _context.DocumentIn.ToList()
            .Join(Emps, d => d.EmpFrom, e => ((Employee)e).Id, (d, e)=> new { DocumentIn= d, Employee = e })
            .Select(c=> new DocumentInViewModel { DocName = c.DocumentIn.DocName, EmpName = c.Employee.EmpName })
            .ToList();

Более подробную информацию об операторе Linq Join, вы можете проверить этот поток .

0 голосов
/ 06 августа 2020

Почему бы вам не создать представление в базе данных и не использовать его для отображения обеих моделей в соответствии с вашими требованиями

...