[英]LINQ Select rows with Max of one column and Distinct in another
我正在使用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)
,然后可以將其RateTypeID
到其他查詢中,以通過RateTypeID
有效地確定應用於每個項目的當前匯率。 IsRetired
必須為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進行的: 我如何通過SQL中的另一列選擇具有MAX(Column value),DISTINCT的行?
我在vb.net中編碼,但也會采用ac#答案。 謝謝!
使用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()
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.