将SQL Groupby + Sum转换为C#lambda表达式

时间:2018-06-27 02:13:46

标签: c# entity-framework

我在带有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);

我有一个问题:

  1. 我已经预览了查询结果,结果似乎是正确的,但是我不明白为什么要通过First()方法(例如group.First()。FullName)获取组成员, 基于MSDN document First()方法-返回满足指定条件的序列中的第一个元素。 那么这是否意味着仅从[grp]获取第一行? 如何改善上面的lambda表达式?

  2. 通过Visual Studio 2017,它可以在调试模式下可视化LINQ生成的SQL,但是它无法检查是否使用lambda Expression,我发现的另一有趣之处是,无论我在MySQL上启用SQL事件探查器如何。 通过lambda表达式生成的SQL将不会被记录。 那么如何像使用LINQ2SQL一样预览SQL?

0 个答案:

没有答案