Не выводить в запросе данные из связанной таблицы в цикле EF
Есть две связанных сущности Dealer и Order со связью один ко многим:
public class Dealer
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[JsonPropertyName("id")]
public int DealerId { get; set; }
[JsonPropertyName("firstName")]
public string FirstName { get; set; }
[JsonPropertyName("lastName")]
public string LastName { get; set; }
[JsonPropertyName("telephone")]
public long? Telephone { get; set; }
[JsonPropertyName("debts")]
public float Debts { get; set; }
[JsonPropertyName("city")]
public string City { get; set; }
public virtual ICollection<Order>? Orders { get; set; }
}
public class Order
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[JsonPropertyName("id")]
public int Id { get; set; }
[JsonPropertyName("dealerId")]
public int DealerId { get; set; }
public virtual Dealer Dealer { get; set; }
[JsonPropertyName("dateOrder")]
public DateTime DateOrder { get; set; }
[JsonPropertyName("operatorId")]
public int OperatorId { get; set; } = 1;
[JsonPropertyName("sum")]
public float Sum { get; set; }
[JsonPropertyName("status")]
public string Status { get; set; }
}
После запроса данных из таблицы Orders мне автоматически подтягивает данные из второй таблицы Dealers через внешний ключ. Но так же поскольку у сущности Dealer есть свойство
public virtual ICollection<Order>? Orders { get; set; }
EF или JSON(честно говоря я не знаю кто из них) пытается еще раз подтянуть список Order из первой таблицы. И так по кругу.
я установил ограничение на зацикливание через
builder.Services.AddControllers().AddNewtonsoftJson(options =>
options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore);
Если для Get-запроса Dealer это сработало, то с заказы мне выдает вот так:
То есть подтягивая первый Order, подтягивает его Dealer,а у него еще раз успевает запросить Order. Как это исправить? А еще лучше как вместо свойства DealerId в сущности Order вывести вывести LastName и FirstName от Dealer?
Сам запрос к БД с сортировкой:
var sortDealers = sort == "asc" ?
_context.Orders
.Select(x => x)
.Include(x => x.Dealer)
.OrderBy(x => EF.Property<object>(x, property)) :
sort == "desc" ?
_context.Orders
.Select(x => x)
.Include(x => x.Dealer)
.OrderByDescending(x => EF.Property<object>(x, property)) :
_context.Orders
.Include(x => x.Dealer)
.Select(x => x);
Ответы (1 шт):
В общем отвечать никто не хочет, пришлось самому решить =)
var sortDealers =
sort == "asc" ?
_context.Orders
.Include(x => x.Dealer)
.Select(x => new OrderG
{
Id = x.Id,
DateOrder = x.DateOrder,
OperatorId = x.OperatorId,
Sum = x.Sum,
Status = x.Status,
DealerFullName = x.Dealer.FirstName + " " + x.Dealer.LastName,
})
.AsQueryable()
.OrderBy(x => EF.Property<object>(x, property)):
Здесь только кусок кода, остальной код условия опустил.
Запрашиваю нужные поля и ручками маплю их в DTO сущность. Да, я видел такие способы решения, но у меня почему то сначала они не сработали.
