Linq到实体返回一个包含来自另一个列表的元素的列表

本文关键字:列表 包含 另一个 一个 元素 实体 返回 Linq | 更新日期: 2023-09-27 18:08:27

我已经重复尝试了不同的事情来做到这一点。我需要查询一个数据库,只返回有包含在一个列表中的日期的记录-像一个动态的"在哪里"语句。我确信它会涉及到=>,但不能得到语法正确。

我在下面建立一个简短的列表来测试,但它可以有任何数量的项目。

下面的

只需要返回total的记录。datesToShow中包含date_reference。

          List<DateTime> datesToShow = new List<DateTime>();
        datesToShow.Add(new DateTime(2016, 9, 22));
        datesToShow.Add(new DateTime(2016, 9, 21));
        var todays_totals = (from total in dbContext.daily_totals
                              select new
                             {
                                 total.customer.customer_name,
                                 total.date_reference,
                                 total.EDI_PODs_sent,
                                 total.open_stops,
                                 total.total_pieces,
                                 total.new_stops,
                                 total.total_weight,
                                 total.Unsent_PODs_released,
                                 total.Unsent_PODs_unreleased,
                                 total.last_updated
                             }).ToArray();

如果我这样做:

    var todays_totals = (from total in dbContext.daily_totals
                             select new
                          {
                              total.customer.customer_name,
                              total.date_reference,
                              total.EDI_PODs_sent,
                              total.open_stops,
                              total.total_pieces,
                              total.new_stops,
                              total.total_weight,
                              total.Unsent_PODs_released,
                              total.Unsent_PODs_unreleased,
                              total.last_updated
                          }).Where(el => datesToShow.Contains(el.date_reference)).ToArray();

我得到一个"未知方法在哪里(?)…"我试过使用列表和数组,如:

   DateTime[] datesToShow = new DateTime[] 
        {
            new DateTime (2016,9,22),
            new DateTime (2016,9,23)
        };

我也可以使用todays_totals的子集作为新的结果集。如下所示(我实际上是从这里开始的)

 var newList = (from t in todays_totals where (t=>datesToShow.Contains(t.date_reference))).ToArray();

Linq到实体返回一个包含来自另一个列表的元素的列表

您可以尝试使用Contains扩展方法:

     var todays_totals = (from total in dbContext.daily_totals
                          where datesToShow.Contains(DbFunctions.TruncateTime(total.date_reference))
                          select new
                         {
                             total.customer.customer_name,
                             total.date_reference,
                             total.EDI_PODs_sent,
                             total.open_stops,
                             total.total_pieces,
                             total.new_stops,
                             total.total_weight,
                             total.Unsent_PODs_released,
                             total.Unsent_PODs_unreleased,
                             total.last_updated
                         }).ToArray();

DbFunction.TruncateTime将帮助您清洁您的日期,以防它们随时间而来。

有两种方法可以做你想做的事情,这基本上是相同的:

  1. 使用LINQ where语句。它们可以接受任何返回bool的有效c#表达式:

    (from total in dbContext.daily_totals
    where datesToShow.Contains(total.date_reference)
    select new
    {
        // your select items...
    }).ToArray();
    
  2. WHERE子句使用LINQ扩展方法,如您所指出的,它将包含一个lambda表达式:

    (from total in dbContext.daily_totals
    select new
    {
        // your select items...
    })
    .Where(el => datesToShow.Contains(el.date_reference))
    .ToArray();
    

使用Lambda表达式

List<DateTime> datesToShow = new List<DateTime>();
datesToShow.Add(new DateTime(2016, 9, 22));
datesToShow.Add(new DateTime(2016, 9, 21));
var todays_totals = dbContext.daily_totals.Where(o=> datesToShows.Contains(o.date_reference)).ToList();
//Result should be a list that contains records that match those 2 dates.

希望这对你有帮助!