Как отобразить детали строки из нескольких таблиц с помощью LINQ? - PullRequest
0 голосов
/ 22 мая 2019

Я застрял здесь в ситуации, когда я должен отобразить данные о человеке вместе со списком его / ее распределения. Я закончил создание модели представления для передачи данных в представление, но результат:

Элемент модели, передаваемый в словарь, имеет тип 'System.Data.Entity.Infrastructure.DbQuery`1 [EKCMIDTA.ViewModels.EmployeeDetailsVM]', но для этого словаря требуется элемент модели типа 'EKCMIDTA.ViewModels.EmployeeDetailsVM' .

Для таблицы TicketScannings я просто хотел узнать, использовал ли человек некоторые из распределений, и подсчитать, сколько было использовано, независимо от того, равно ли оно нулю.

Я надеюсь, что кто-то может помочь мне с этим.

Спасибо!

Контроллер:

public ActionResult GetDetails(int empId)
{
    var employeeInformation = identityContext.AspNetUsers.Find(empId);

    var employeeDetails = dbContext.TicketAllocations.Include(a => a.AllocationCategory).Where(t => t.CMId == empId).ToList();

    var query = (from alloc in dbContext.TicketAllocations
                 join scan in dbContext.TicketScannings
                 on alloc.Id equals scan.TicketAllocationId
                 join card in dbContext.CardNumberAssignments
                 on alloc.CMId equals card.CMId into a
                 from card in a.DefaultIfEmpty()
                 join reserve in dbContext.ReservedCardNumbers
                 on card.CardNumberId equals reserve.Id into b
                 from reserve in b.DefaultIfEmpty()
                 where (alloc.CMId == empId)
                 select new EmployeeDetailsVM()
                 {
                     Employee = new Employee()
                     {
                         FirstName = employeeInformation.FirstName,
                         LastName = employeeInformation.LastName,
                         CMId = employeeInformation.Id,
                         CardNumber = reserve == null ? "No Card Number yet" : reserve.CardNumber,
                         QRCode = card == null ? "No QR Code yet" : card.QRCode
                     },

                     GetTicketAllocations = employeeDetails
                 });

      return View(query);

Просмотр модели:

public class EmployeeDetailsVM
{
    public Employee Employee { get; set; }
    public IEnumerable<Allocation> GetTicketAllocations { get; set; }
}

public class Employee
{
    public string CMId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string CardNumber { get; set; }
    public string QRCode { get; set; }
}

public class Allocation
{
    public int AllocationId { get; set; }
    public string AllocationName { get; set; }
    public int Quantity { get; set; }
    public bool IsActive { get; set; }
    public string CreatedBy { get; set; }
    public DateTime CreatedDate { get; set; }
    public string ModifiedBy { get; set; }
    public DateTime ModifiedDate { get; set; }
}

Вид:

@model EKCMIDTA.ViewModels.EmployeeDetailsVM

1 Ответ

0 голосов
/ 22 мая 2019

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

, поэтому вы можете изменить @model EKCMIDTA.ViewModels.EmployeeDetailsVM на @model IEnumerable<EKCMIDTA.ViewModels.EmployeeDetailsVM>

или измените действие GetDetails на return View(query.FirstOrDefault());

Редактировать на основе комментария

public ActionResult GetDetails(int empId)
{
    var employeeInformation = identityContext.AspNetUsers.Find(empId);

    var employeeTickets = dbContext.TicketAllocations.Include(a => a.AllocationCategory).Where(t => t.CMId == empId).ToList();

    var employeeDetails = (from alloc in dbContext.TicketAllocations
                 join scan in dbContext.TicketScannings
                 on alloc.Id equals scan.TicketAllocationId
                 join card in dbContext.CardNumberAssignments
                 on alloc.CMId equals card.CMId into a
                 from card in a.DefaultIfEmpty()
                 join reserve in dbContext.ReservedCardNumbers
                 on card.CardNumberId equals reserve.Id into b
                 from reserve in b.DefaultIfEmpty()
                 where (alloc.CMId == empId)
                 select new EmployeeDetailsVM()
                 {
                     Employee = new Employee()
                     {
                         FirstName = employeeInformation.FirstName,
                         LastName = employeeInformation.LastName,
                         CMId = employeeInformation.Id,
                         CardNumber = reserve == null ? "No Card Number yet" : reserve.CardNumber,
                         QRCode = card == null ? "No QR Code yet" : card.QRCode
                     }
                 }).FirstOrDefault();

    if (employeeDetails != null)
        employeeDetails.GetTicketAllocations = employeeTickets;

    return View(employeeDetails);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...