簡體   English   中英

LINQ選擇一行最多包含一列而另一列不同的列

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM