你写道:
PaymentId 列自动递增
我的建议是将PaymentHistories 分组为每个用户,因此按 CustomerId 的共同值。
然后对于每个组,保留具有最高值PaymentId 的PaymentHistory。毕竟:PaymentId 是自动递增的,所以客户 X 的 PaymentHistories 组中的 PaymentHistory 是 PaymentId 最高的那个
为此,我使用了具有参数 resultSelector 的 Queryable.GroupBy 的重载,因此我可以精确地指定我想要的结果。
IQueryable<PaymentHistory> paymentHistories = ...
var lastCustomerPayments = paymentHistories.GroupBy(
// parameter keySelector: make groups with same CustomerId
paymentHistory => paymentHistory.CustomerId,
// parameter resultSelector: for every CustomerId and all PaymentHistories
// that have this value for CustomerId, make one new:
(customerId, paymentHistoriesWithThisCustomerId) => new
{
CustomerId = customerId,
// get the feePaid of the PaymentHistory with the largest PaymentId
FeePaid = paymentHistoriesWithThisCustomerId
.OrderByDescending(paymentHistory => paymentHistory.PaymentId)
.Select(paymentHistory => paymentHistory.FeePaid)
.FirstOrDefault(),
}
如果不想要 FeePaid,还想要 PaymentId,请使用以下 resultSelector:
(customerId, paymentHistoriesWithThisCustomerId) => new
{
CustomerId = customerId,
LastPayment = paymentHistoriesWithThisCustomerId
.OrderByDescending(paymentHistory => paymentHistory.PaymentId)
.Select(paymentHistory => new
{
PaymentId = paymentHistory.PaymentId,
FeePaid = paymentHistory.FeePaid,
})
.FirstOrDefault();
}