如何将带有MAX + GROUP BY的SQL转换为LINQ?

时间:2019-05-25 11:41:58

标签: c# linq sql-to-linq-conversion

我正在弄清楚如何使用LINQ,并且我开始越来越了解它。但是我有一个SQL查询,我不知道如何转换为LINQ。

我有一个数据库表,其中包含有关租车的信息。从此表中,我需要查询租车最多的车主,车主的ID和车主的名字,这10个车位中。 SQL查询如下所示:

SELECT TOP 10 owner_name, MAX(calculated_owner_rental_count) as totalRentals, owner_id
FROM[rentals]
WHERE owner_name IS NOT NULL
GROUP BY owner_name, owner_id
ORDER BY totalRentals DESC

现在,我尝试将其转换为LINQ并自动填充一个对象并将其添加到列表中。到目前为止,我的尝试:

private List<TopOwner> GetTopOwners() {
  return Rentals
     .Select(x => new TopOwner { OwnerName = x.OwnerName, CalculatedOwnerRentalCount = Rentals.Max(x => x.CalculatedOwnerRentalCount), OwnerId = x.OwnerId })
    .Where(x => x.OwnerName != null)
    .OrderByDescending(x => x.CalculatedOwnerRentalCount)
    .GroupBy(x => new { x.OwnerName, x.OwnerId })
    .Take(10)
    .ToList();
}

但是在CalculatedOwnerRentalCount = Rentals.Max(x => x.CalculatedOwnerRentalCount)行下面,我得到了错误 Cannot implicitly convert type 'int?' to 'int'. An explicit conversion exists (are you missing a cast?)使我相信LINQ查询有问题。

TopOwner模型类如下:

public class TopOwner {
  public string OwnerName;
  public int CalculatedOwnerRentalCount;
  public int OwnerId;
}

有人可以发现我的LINQ查询错了吗?将不胜感激。

1 个答案:

答案 0 :(得分:0)

很显然,您正在尝试在Max(可为null的整数)列表上进行int?
并且您输出的类TopOwner的{​​{1}}的类型为CalculatedOwnerRentalCount
因此,您遇到了转换问题-从intint?,如编译器提示的那样。