首先,我的英语不是最好的,但我正在努力。
好吧,我刚刚搬到了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。
此致
答案 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();