LINQ — Как написать запрос, когда у модели есть свойство списка?

#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();
    }