LINQ Проекция и загрузка дочерних объектов - PullRequest
1 голос
/ 20 февраля 2020

Проблемы с проекцией и загрузкой дочерних объектов. Ниже приведен упрощенный код для представления логики c, которую я пытаюсь реализовать, а не фактический код.

public class TicketItem
{
    public int TicketItemId { get; set; }
    public string TicketReason { get; set; }
    public Station Station { get; set; }
    public TicketOwner TicketOwner { get; set; }
}

public class Station
{
    public int StationId { get; set; }
    public string Name { get; set; }
}

public class TicketOwner
{
    public int TicketOwnerId { get; set; }
    public Employee Employee { get; set; }
    public Organization Organization { get; set; }
}

public class Employee
{
    public int EmployeeId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class Organization
{
    public int OrganizationId { get; set; }
    public string Code { get; set; }
    public string Name { get; set; }
}

public class CommonReasons
{
    public int CommonReasonId { get; set; }
    public string Reason { get; set; }
}


public TicketItem GetById(int id)
{
    var query = from i in _dataContext.TicketItems
                                    .Include("Station")
                                    .Include("TicketOwner.Employee")
                                    .Include("TicketOwner.Organization")
                join r in _dataContext.CommonReasons on i.TicketReason equals r.CommonReasonId.ToString() into r1
                from r2 in r1.DefaultIfEmpty()
                where i.TicketItemId == id
                select new TicketItem {
                    TicketItemId = i.TicketItemId,
                    TicketReason = r2.Reason == null ? i.Reason : r2.Reason,
                    Station = i.Station,
                    TicketOwner = i.TicketOwner
                };
    return query
            .AsNoTracking()
            .FirstOrDefault();
}

Большая часть кода не требует пояснений. Часть, косвенно вызывающая проблему, будет связана между свойством TicketItem.TicketReason (строка) и объектом CommonReasons. Со стороны пользовательского интерфейса конечный пользователь имеет поле ввода «Причина», и он может выбрать из «общих» причин или ввести причину adho c. Первоначальный разработчик решил, что свойство TicketReason должно содержать либо идентификатор ключа из таблицы CommonReasons (если пользователь выбрал в раскрывающемся списке), либо причину adho c, введенную.

Итак, чтобы обработать эту логику c в запросе linq, единственный способ, который я нашел, это сделать левое соединение между TicketItem.TicketReason и CommonReasons.CommonReasonId, а затем с помощью проекции изменить столбец TicketReason, возвращая либо текст общей причины, либо adho c текст. Если есть другой способ сделать это, который помог бы мне справиться с проблемой, с которой я столкнулся с проекцией / включением, у меня все уши.

По логике «причины» c этот запрос работает , возвращая правильный текст. Проблема в том, что ни один из объектов «внучат» не возвращается, то есть TicketItem.TicketOwner.Employee, TicketItem.TicketOwner.Organization. Как заставить эти объекты также возвращать?

Изменение структуры таблиц было бы абсолютным последним средством, только на основе количества кода, который должен был бы измениться. В коде есть другие места, которые используют приведенную выше логику c, но не нуждаются в дочерних объектах.

Любая помощь приветствуется. Надеюсь, я достаточно объяснил.

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