У меня есть следующие классы
public class Order
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public DateTime Date { get; set; }
public decimal TotalPaid { get { return Payments.Sum(x => x.Amount); } }
public decimal Total { get { return OrderItems.Sum(x => x.TotalPrice); } }
public bool PaidCompletely { get { return Total == TotalPaid; } }
public List<OrderItem> OrderItems { get; set; } = new List<OrderItem>();
public List<Payment> Payments { get; set; } = new List<Payment>();
}
public class OrderItem
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public decimal PricePerUnit { get; set; }
public decimal Quantity { get; set; }
public decimal TotalPrice { get { return PricePerUnit * Quantity; } }
}
public class Payment
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public decimal Amount { get; set; }
public DateTime Date { get; set; }
}
Я хочу получить все заказы, которые не полностью оплачены.
Следующее не работает
var OrdersNotFullyPaidShort =
context
.Orders
.Where(order => !order.PaidCompletely)
.ToList();
предоставлениеошибка
Не удалось перевести выражение LINQ 'Где (источник: DbSet, предикат: (o) =>! (o.PaidCompletely)) "...
Следующее работает, но я должен снова переписать всю логику в запросе, в то время как у меня есть логика, также определенная в классах:
var OrdersNotFullyPaidLong =
context
.Orders
.Where(order => order.OrderItems.Sum(orderItem => orderItem.PricePerUnit * orderItem.Quantity) == order.Payments.Sum(payment => payment.Amount))
.ToList();
, и генерирует этот довольно уродливый запрос:
SELECT [o].[Id], [o].[Date]
FROM [Orders] AS [o]
WHERE (((
SELECT SUM([o0].[PricePerUnit] * [o0].[Quantity])
FROM [OrderItems] AS [o0]
WHERE ([o].[Id] = [o0].[OrderId]) AND [o0].[OrderId] IS NOT NULL) = (
SELECT SUM([p].[Amount])
FROM [Payments] AS [p]
WHERE ([o].[Id] = [p].[OrderId]) AND [p].[OrderId] IS NOT NULL)) AND ((
SELECT SUM([o0].[PricePerUnit] * [o0].[Quantity])
FROM [OrderItems] AS [o0]
WHERE ([o].[Id] = [o0].[OrderId]) AND [o0].[OrderId] IS NOT NULL) IS NOT NULL AND (
SELECT SUM([p].[Amount])
FROM [Payments] AS [p]
WHERE ([o].[Id] = [p].[OrderId]) AND [p].[OrderId] IS NOT NULL) IS NOT NULL)) OR ((
SELECT SUM([o0].[PricePerUnit] * [o0].[Quantity])
FROM [OrderItems] AS [o0]
WHERE ([o].[Id] = [o0].[OrderId]) AND [o0].[OrderId] IS NOT NULL) IS NULL AND (
SELECT SUM([p].[Amount])
FROM [Payments] AS [p]
WHERE ([o].[Id] = [p].[OrderId]) AND [p].[OrderId] IS NOT NULL) IS NULL)
Нет ли способа использовать мой первый способ запроса? Что я делаю не так, мои классы плохо определены?