У меня есть соединение в 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 может быть списком<> или разделенным запятыми.
Да, согласно ответу Марку ниже. Я все еще не могу заставить соединение работать с одним столбцом
Вы пробовали что-то вроде этого:
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<>.
Можете ли вы добавить схему, с которой работаете, чтобы визуализировать это?
Отредактировано с примерами данных
Как получить список заказов, используя только Значения 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();
Вы пробовали что-нибудь? Если мы увидим ваши усилия, включая определения классов. а где вы застряли мы тоже понимаем вопрос.