c# - LINQ 选择一列中具有 Max 且另一列中具有 Distinct 的行

标签 c# vb.net linq linq-to-entities

我正在使用 LINQ to Entities 查询以下 MS-SQL 表:

RateID  RateTypeID  Amount  EffectiveDate   IsRetired
------  ----------  ------  -------------   ---------
1       1           0.565   1/1/2013 0:00   FALSE
2       2           6.000   1/1/2013 0:00   FALSE
3       3           9.000   1/1/2013 0:00   FALSE
4       4           12.000  1/1/2013 0:00   FALSE
5       5           1.500   1/1/2013 0:00   FALSE
6       1           0.550   7/1/2012 0:00   FALSE
7       1           0.495   1/1/2012 0:00   FALSE
8       3           8.000   1/1/2011 0:00   FALSE
9       3           11.000  1/1/2015 0:00   FALSE
10      5           2.000   7/1/2013 0:00   TRUE

我想构建一个函数,该函数将使用 LINQ 返回一个 IQueryable(Of Rate),然后我可以将其加入到其他查询中,以通过 RateTypeIDIsRetired 必须为 false,我需要具有最近的过去 EffectiveDate 的行。

这是我得到的最接近的(LINQPad VB 语句):

Dim dateNow As Date = Date.Now
Dim result = (
    From r In Rates
    Where r.IsRetired = False And r.EffectiveDate <= dateNow
    Group r By r.RateTypeID
    Into rg = Group
    Select New With {
        .cr = rg.OrderByDescending(Function(r) r.EffectiveDate).Take(1)
    }
)
result.Dump()

此查询返回 DbQuery(Of AnonymousType_1(Of IEnumerable(Of Rate))) (每个集合都有 1 个费率项的集合),这并不是我想要的。

此问答解决了一个非常相似的问题,但使用的是 SQL 而不是 LINQ: How can I SELECT rows with MAX(Column value), DISTINCT by another column in SQL?

我正在 vb.net 中编码,但也会采用 C# 答案。谢谢!

最佳答案

使用Take()返回IEnumerable<T>FirstOrDefault()仅返回 <T> ,所以:

IQueryable<RecentRate> query = from r in Rates
                               where r.IsRetired == false && r.EffectiveDate <= dateNow
                               group r by r.RateTypeID into rg
                               select new RecentRate
                               {
                                 Rate = rg.OrderByDescending(r => r.EffectiveDate).FirstOrDefault()
                               };

这可能有效:

   IQueryable<Rate> query = from r in Rates
                            where r.IsRetired == false && r.EffectiveDate <= dateNow
                            group r by r.RateTypeID into rg
                            select rg.OrderByDescending(r => r.EffectiveDate).FirstOrDefault();

我认为这是VB语法

Dim result = (
    From r In Rates
    Where r.IsRetired = False And r.EffectiveDate <= dateNow
    Group r By r.RateTypeID
    Into rg = Group
    Select rg.OrderByDescending(Function(r) r.EffectiveDate).FirstOrDefault()
)

关于c# - LINQ 选择一列中具有 Max 且另一列中具有 Distinct 的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20405789/

相关文章:

c# - 如何使用 LINQ 在 db 上下文中为 3 个不同的表在 asp .net mvc 中编写通用查询?

c# - 以集合为键分组

c# - IdenityServer 和每个租户策略实现数据库

c# - IAsyncResult.AsyncWaitHandle 的使用

c# - 反序列化为没有 XML 容器元素的列表

c# - 在未能使用网络级身份验证向远程桌面服务器提供正确凭据后防止登录尝试失败窗口

.net - 面向 VB6 程序员的 VB.NET 中的 VB 运行时函数

c# - LINQ to DataSet 多表左连接

vb.net - 在 VB.NET 表单之间传递数据

c# - 错误消息 : "Only primitive types or enumeration types are supported in this context."