【问题标题】:LINQ query records based on date array基于日期数组的 LINQ 查询记录
【发布时间】:2011-10-13 05:19:09
【问题描述】:

我有一个表(我正在使用实体模型)并使用运行正常的 LINQ 查询过滤了该表。 现在我想根据日期数组过滤记录。我无法在日期数组上实现 IN 子句

filteredList = leadsNewAndScheduled.Where(lead =>  
              (LeadTypeIDs.Contains(lead.TYPE_ID.ToString()) ||
              LeadTypeIDs == string.Empty) &&
              (priorityIDs.Contains(lead.PRIORITY_ID.ToString()) ||
              priorityIDs == string.Empty) &&
              (((lead.EXPIRED_ON <= dateExpiry ||
              Convert.ToDateTime(lead.EXPIRED_ON) == DateTime.Today.Date) &&
              lead.STATUS_ID == (int)Enumerations.LeadStatus.New) ||
              lead.STATUS_ID == (int)Enumerations.LeadStatus.Active) &&
              (lead.START_TIME IN (arrAppointmentDates))
            ).ToList();

我需要你的帮助

(lead.START_TIME IN (arrAppointmentDates))

提前致谢。

【问题讨论】:

    标签: linq-to-sql linq-to-entities linq-to-objects


    【解决方案1】:

    使用Predicate Builder

    在没有日期条件的情况下编写查询

    var query = leadsNewAndScheduled.Where(lead =>  
                  (LeadTypeIDs.Contains(lead.TYPE_ID.ToString()) ||
                  LeadTypeIDs == string.Empty) && ....
    

    然后写

      var predicate = PredicateBuilder.False<Lead>();
    
      foreach (DateTime date in dates)
      {
        DateTime temp = date;
        predicate = predicate.Or (p => p.START_TIME == temp);
      }
    
      var result = query.Where(predicate).ToList(); // Don't call ToList() earlier
    

    但是请注意,如果您使用的是实体框架,则需要在实体集上调用 AsExpandable(),然后再对其应用谓词,如下所示:

    return objectContext.Products.AsExpandable().Where (predicate);
    

    【讨论】:

    • 谢谢哈桑,我从你给定的源代码创建了一个类 PredicateBuilder 并实现了以下代码; var predicate = PredicateBuilder.False(); foreach(arrAppointmentDates 中的 DateTime 日期){ DateTime temp = date;谓词 = predicate.Or(p => Convert.ToDateTime(p.START_TIME).Date == temp);过滤列表 = 过滤列表.Where(谓词).ToList();但它给了我以下错误“System.Collections.Generic.List”不包含“Where”的定义。这方面的任何帮助...
    • 你有 System.Linq 命名空间吗?
    • 是的,我已经包含 System.Linq
    • leadsNewAndScheduled 的类型是什么,它来自哪里?
    • leadsNewAndScheduled 属于复杂类型的实体模型(即 List()),它是 MSSQL 存储过程的输出。
    【解决方案2】:

    我在声明日期列表然后在 LINQ 查询中应用包含子句时解决了这个问题。

    示例:

    //list of dates.
    List<DateTime> arrAppointmentDates;
    
    //change in query
    arrAppointmentDates.Contains(Convert.ToDateTime(lead.START_TIME).Date)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多