我在带有EF项目的ASP.NET核心项目中从事捐赠工作,我将按创建者创建捐赠列表组,并按总额进行排序。
通过SQL查询2个表[DonationTransaction]和[Aspnetusers]很简单:
SELECT CONCAT(u.FirstName, " ", u.LastName) as Fullname, 'BuddyIcon.jpg' as Image, SUM(t.amount)
FROM donation_transaction t
LEFT JOIN aspnetusers u
ON u.Id = t.user_id
按t.user_id分组 按SUM(t.amount)DESC排序
但是,通过使用带有EF的回购模式,我必须通过lambda表达式进行查询。
IEnumerable < DonationTransaction > tranlist = _donationTransactionService.GetDonationTransactions();
IEnumerable < Aspnetusers > userlist = _userService.GetUsers();
IEnumerable < DonationRanking > founderlist = tranlist.Join(userlist,
t => t.UserId,
u => u.Id,
(t, u) => new {
UserID = u.Id, FullName = u.FirstName + " " + u.LastName, Image = "BuddyIcon.jpg", Amount = t.Amount
})
.GroupBy(grp => grp.UserID)
.Select(group => new DonationRanking {
Name = group.First().FullName,
Image = group.First().Image,
TotalAmount = group.Sum(ta => ta.Amount)
})
.OrderByDescending(dr => dr.TotalAmount);
我有一个问题:
我已经预览了查询结果,结果似乎是正确的,但是我不明白为什么要通过First()方法(例如group.First()。FullName)获取组成员, 基于MSDN document First()方法-返回满足指定条件的序列中的第一个元素。 那么这是否意味着仅从[grp]获取第一行? 如何改善上面的lambda表达式?
通过Visual Studio 2017,它可以在调试模式下可视化LINQ生成的SQL,但是它无法检查是否使用lambda Expression,我发现的另一有趣之处是,无论我在MySQL上启用SQL事件探查器如何。 通过lambda表达式生成的SQL将不会被记录。 那么如何像使用LINQ2SQL一样预览SQL?