如何根据另一个列表字段筛选一个列表

时间:2016-01-03 18:49:14

标签: c# entity-framework linq linq-to-entities

我从分离器表中获取数据库中的数据并存储在单独的变量中。

这是第一个清单

   var res = (from v in context.MasterValues
                       join c in context.MasterCategories on v.Category_Id equals c.Id
                       where c.Model_Key == (int)model && c.Name == tableName && v.Version_Id == version && v.Active == "Y" && c.Name.Equals("FXRates")
                       select new 
                       {
                           Id = v.Id,
                           VersionId = v.Version_Id,
                           Text1 = v.Text1,
                       }).ToList();

这是第二个清单

        var fxview = context.MasterFXRates.Select
            (x => new
            {
                Currency_code = x.Currency_code,
                Rate = x.Rate,
                Effective_dt = x.Effective_dt
            }
            ).ToList();

那么现在如何根据我的第一个列表中的数据从我的第二个列表 fxview 中过滤数据? 即 我需要过滤其中Currency_code的list2数据与List1的Text1匹配的数据,其中effective_dt(datetime列)是最大值/最新日期

例如,如果第二个列表数据有

  1. ABC,100,2010-10-10
  2. ABC,120,2014-12-12
  3. DEF,700,2013-08-02
  4. DEF,500,2015-06-06
  5. List 1(res)有以下数据

    1. 1,1,ABC
    2. 2,1,DEF
    3. 因此,在过滤后,我的最终列表必须具有以下输出

      1. ABC,120(自2014-12-12起是最新日期,将提取相应的值,并应过滤重复值(ABC,100)。)
      2. 2.DEF,500(自2015-06-06以来是最新日期,将提取相应的值并应过滤重复值(DEF,& 00)。)

2 个答案:

答案 0 :(得分:0)

  fxView = fxView.OrderByDescending(x => x.effectiveDate).ToList();
  var result = new List();
 res.ForEach((x) => result.Add(fxView.First(y => x.text1 == y.currency_code)));

如果effectiveDate已经是DateTime,则应该可以使用,否则将其转换为DateTime

 var fxview = context.MasterFXRates.Select
        (x => new
        {
            Currency_code = x.Currency_code,
            Rate = x.Rate,
            Effective_dt = Convert.ToDateTime(x.Effective_dt)
        }
        ).ToList();

答案 1 :(得分:0)

 var result = from masterFxRate in masterFxRates
                     join masterValue in masterValues on masterFxRate.Currency_code equals masterValue.Text1
                     group masterFxRate by
                     new
                     {
                         masterFxRate.Currency_code
                     } into groupedRates
                     select new
                     {
                         groupedRates.Key.Currency_code,
                         Rate = groupedRates.FirstOrDefault(g => g.Effective_dt != null 
                                                              && g.Effective_dt == groupedRates.Max(c => c.Effective_dt)).Rate
                     };

        foreach (var item in result)
        {
            Console.WriteLine("{0} : {1} ", item.Currency_code, item.Rate);
        }