Entity Framework C# объединяется только с одним столбцом из второй таблицы

У меня есть соединение в Entity Framework, соединяющее таблицы Order и OrderItem. Все заказы будут состоять из нескольких позиций заказа. Пытаюсь вернуть все заказы, но из списка orderItemStatus только столбец OrderItem.

В моем классе модели Order у меня есть это свойство:

public List<int>? orderItemStatus { get; set; }

Я присоединяюсь к двум таблицам, но он возвращает все столбцы из OrderItem.

orderList = await _context.Order
                          .Include(orderItem => orderItem)
                          .ToListAsync();

Как получить список заказов только со значениями OrderItem.orderItemStatus?

Таблица заказов

Таблица OrderItem

Обязательные результаты — столбец OrderItemStatus может быть списком<> или разделенным запятыми.

Вы пробовали что-нибудь? Если мы увидим ваши усилия, включая определения классов. а где вы застряли мы тоже понимаем вопрос.

Gert Arnold 12.07.2024 21:29

Да, согласно ответу Марку ниже. Я все еще не могу заставить соединение работать с одним столбцом

Sherry8212 16.07.2024 08:25
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
60
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы пробовали что-то вроде этого:

   orderList = await  _context.Order
            .Join(_context.OrderItem,
                o => o.OrderId,
                oi => oi.OrderId,
                (o,oi) => new { o,io })
            .Select(ol => new
            {
                OrderId = o.Order.OrderId,
                /* Order columns  here */
                OrderItemStatus = oi.OrderItem.orderItemStatus
            })
            .ToListAsync();

Это выбирает анонимный класс, но вы можете определить класс и выбрать его.

Попробовал, спасибо. Я не могу назначить список значений oi.OrderItem.orderItemStatus для OrderItemStatus - не могу преобразовать int в List<>.

Sherry8212 11.07.2024 19:40

Можете ли вы добавить схему, с которой работаете, чтобы визуализировать это?

Mark McWhirter 11.07.2024 23:10

Отредактировано с примерами данных

Sherry8212 12.07.2024 11:16

Как получить список заказов, используя только Значения OrderItem.orderItemStatus? Я не могу назначить список значений oi.OrderItem.orderItemStatus для OrderItemStatus - не могу преобразовать int в List<>

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

Чтобы реализовать это, вам необходимо определить модель представления для хранения набора результатов. Затем используйте запрос LINQ с Select, чтобы спроецировать результат в модель представления.

Давайте посмотрим на практике, как мы можем это реализовать:

Допустим, у вас есть модель, как показано ниже:

Модель домена:

public class Order
{
    public int OrderId { get; set; }
    public List<OrderItem> OrderItems { get; set; }
}

public class OrderItem
{
    public int OrderItemId { get; set; }
    public int OrderItemStatus { get; set; }
}

Посмотреть модель для проекции:

public class OrderWithStatusViewModel
{
    public int OrderId { get; set; }
    public List<int> OrderItemStatus { get; set; }
}

Демонстрационный контроллер:

[ApiController]
[Route("api/[controller]")]
public class OrdersController : ControllerBase
{
    [HttpGet("GetSampleOrdersWithStatus")]
    public ActionResult<List<OrderWithStatusViewModel>> GetSampleOrdersWithStatus()
    {
        var sampleOrders = new List<Order>
        {
            new Order
            {
                OrderId = 1,
                OrderItems = new List<OrderItem>
                {
                    new OrderItem { OrderItemId = 1, OrderItemStatus = 1 },
                    new OrderItem { OrderItemId = 2, OrderItemStatus = 2 }
                }
            },
            new Order
            {
                OrderId = 2,
                OrderItems = new List<OrderItem>
                {
                    new OrderItem { OrderItemId = 3, OrderItemStatus = 3 },
                    new OrderItem { OrderItemId = 4, OrderItemStatus = 4 }
                }
            }
        };

        var result = sampleOrders.Select(order => new OrderWithStatusViewModel
        {
            OrderId = order.OrderId,
            OrderItemStatus = order.OrderItems.Select(item => item.OrderItemStatus).ToList()
        }).ToList();

        return Ok(result);
  
    
    }
}

Примечание:

Примечание. Чтобы смоделировать ваш сценарий, я использовал демонстрационные образцы данных при вызове DbContext. Вы можете получить данные непосредственно из вашего DbContext. Если вы хотите узнать больше о образце и реализации проекта Linq Project , обратитесь к этому официальному документу.

Ответ принят как подходящий

Удалось заставить его работать с GroupJoin

 result = await _context.Order
        .GroupJoin(_context.OrderItem,
        order => order.OrderID,
        orderItem => orderItem.OrderID,
        (Order, OrderItemStatus) => new OrderIndex
        {
            OrderID = Order.OrderID,
            //other Order properties here
            OrderItemStatus = OrderItemStatus.Select(x => x.OrderItemStatus).ToList(),
        }).ToListAsync();

Другие вопросы по теме