Проблемы с проекцией и загрузкой дочерних объектов. Ниже приведен упрощенный код для представления логики 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, но не нуждаются в дочерних объектах.
Любая помощь приветствуется. Надеюсь, я достаточно объяснил.