LinQ Group优先

时间:2018-01-10 18:22:07

标签: c# entity-framework linq

首先,我的英语不是最好的,但我正在努力。

好吧,我刚刚搬到了EF和Linq,我正在学习它,但我在查询中遇到了困难(我不介意将它变为linq或EF)。关键是我有这些对象:

 public class ExchangeRate
{

    public int ExchangeRateID { get; set; }

    public string BaseCurrencyISO { get; set; }

    public string CurrencyISO { get; set; }

    public DateTime RateDate { get; set; }

    public decimal Rate { get; set; }

    public string Source { get; set; }

}

因此,示例数据可能是:

1, "EUR", "USD", 01/01/2018, 1.24, "ECB"
1, "EUR", "AED", 01/01/2018, 1.24, "ECB"
1, "EUR", "USD", 01/01/2017, 1.24, "Bundesbank"
1, "EUR", "AED", 01/01/2018, 1.24, "Bundesbank"
1, "EUR", "ABC", 01/01/2018, 1.24, "Bundesbank"
1, "EUR", "ARS", 01/01/2018, 1.24, "ECB"
1, "EUR", "USD", 01/01/2018, 1.24, "OtherSource"
1, "EUR", "EZZ", 01/01/2018, 1.24, "Bundesbank"
1, "EUR", "DIN", 01/01/2018, 1.24, "Bundesbank"
1, "EUR", "BUM", 01/01/2018, 1.24, "OtherSource"
1, "EUR", "DIN", 01/01/2018, 1.24, "ECB"

我需要的是查询这些对象,每个BaseCurrencyISO只保留一条记录,CurrencyISO和RateDate以任意方式优先处理源字段。在这种情况下,它将是:ECB>德国联邦银行> OtherSource。

因此,查询应返回:

1, "EUR", "USD", 01/01/2018, 1.24, "ECB"
1, "EUR", "AED", 01/01/2018, 1.24, "ECB"
1, "EUR", "USD", 01/01/2017, 1.24, "Bundesbank"
1, "EUR", "ABC", 01/01/2018, 1.24, "Bundesbank"
1, "EUR", "ARS", 01/01/2018, 1.24, "ECB"
1, "EUR", "EZZ", 01/01/2018, 1.24, "Bundesbank"
1, "EUR", "BUM", 01/01/2018, 1.24, "OtherSource"
1, "EUR", "DIN", 01/01/2018, 1.24, "ECB"

我完全迷失了如何去做。

任何指导或建议它是真实的apreciated。

此致

1 个答案:

答案 0 :(得分:1)

我认为该查询将完成这项工作:

exchangeRateList
    .GroupBy(q => new { q.BaseCurrencyISO, q.CurrencyISO, q.RateDate })
    .Select(q => q
        .OrderByDescending(w => w.Source == "ECB")
        .ThenByDescending(w => w.Source == "Bundesbank")
        .ThenByDescending(w => w.Source == "OtherSource")
        .FirstOrDefault())
    .ToList();