#asp.net #linq #asp.net-core-webapi
#asp.net #linq #asp.net-core-webapi
Вопрос:
Я разрабатываю таблицы базы данных на C # (ASP.NET Основной API). Две таблицы имеют отношение «один ко многим» (у одной Order
есть много ToBeOrdered
). Информация: это только две таблицы, не все. Проблема в том, что когда я пытаюсь создать Order
элемент, который должен содержать один или несколько элементов из ToBeOrdered
таблицы, программа фактически создаст множество Order
s, каждый из которых содержит один ToBeOrdered
элемент, а не список.
Order
Модель:
[Key]
public string Id { get; set; }
public string SupplierId { get; set; }
public Supplier Supplier { get; set; }
public List<ToBeOrdered> ToBeOrdered { get; set; }
ToBeOrdere
Модель:
[Key]
public string Id { get; set; }
[Required]
public int Quantity { get; set; }
public string ProductId { get; set; }
public Product Product { get; set; }
public string ProjectId { get; set; }
public Project Project { get; set; }
public string OrderId { get; set; }
public Order Order { get; set; }
Запрос:
public IEnumerable<Order> CreateOrder(string supplierId)
{
IEnumerable<Order> result =
from tbo in _context.ToBeOrdered
join p in _context.Products
on tbo.ProductId equals p.Id
where p.SupplierId == supplierId
select new Order
{
SupplierId = supplierId,
ToBeOrdered = new List<ToBeOrdered> {tbo}
};
return resu<
}
Order
результат модели, например:
[
{
"id": "7deeb60b-e9b4-4925-ac39-7dd983df5f24",
"supplierId": "c76e873d-6bcd-4f97-bacc-a7c55b813d06",
"supplier": null,
"toBeOrdered": [
{
"id": "1",
"quantity": 10,
"productId": "bb4f5a16-1d6e-483c-89f5-7d16ba357691",
"product": null,
"projectId": "068e61cf-50b6-4669-9709-cd279b26ecf3",
"project": null,
"orderId": null,
"order": null
}
]
},
{
"id": "a186887c-6009-4e18-a81a-5b40f8f0ba06",
"supplierId": "c76e873d-6bcd-4f97-bacc-a7c55b813d06",
"supplier": null,
"toBeOrdered": [
{
"id": "2",
"quantity": 20,
"productId": "bb4f5a16-1d6e-483c-89f5-7d16ba357691",
"product": null,
"projectId": "068e61cf-50b6-4669-9709-cd279b26ecf3",
"project": null,
"orderId": null,
"order": null
}
]
}
]
В результате должна быть только одна Order
с двумя ToBeOrdered
моделями в списке.
Что я должен изменить в запросе LINQ?
Комментарии:
1.
ToBeOrdered = tbo.Order.ToBeOrdered
?2. нет. К сожалению, это нехорошо.
3. Включена ли отложенная загрузка? Если да, то отметьте свой список как виртуальный. общедоступный виртуальный список<ToBeOrdered> ToBeOrdered { get; set; } и забудьте о соединении. Просто загрузите свои заказы из БД. ToBeOrdered будет заполнен соответствующим образом. Не забудьте добавить атрибут [foreignkey].
4. Почему бы не настроить ваши отношения в модели / базе данных, а затем вам нужно запрашивать только верхний уровень?
Ответ №1:
Попробуйте этот запрос:
public IEnumerable<Order> CreateOrder(string supplierId)
{
return _context.Set<Order>()
.Include(i=i.ToBeOrdered);
.Where(i=> i.SupplierId == supplierId)
ToArray();
}