2011-09-28 70 views
2

我有一個表(我正在使用實體模型),並使用LINQ查詢過濾該表,它工作正常。 現在我想根據日期數組篩選記錄。我不能夠實現IN子句的日期基於日期數組的LINQ查詢記錄

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)) 

感謝。

回答

1

我解決了這個問題,同時聲明日期列表,然後在LINQ查詢中應用contains子句。

例如:

//list of dates. 
List<DateTime> arrAppointmentDates; 

//change in query 
arrAppointmentDates.Contains(Convert.ToDateTime(lead.START_TIME).Date) 
2

使用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); 
+0

感謝哈桑, 我創建從給定的源類PredicateBuilder和下面的代碼來實現; var predicate = PredicateBuilder.False (); (日期時間日期在arrAppointmentDates) predicate = predicate.Or(p => Convert.ToDateTime(p.START_TIME).Date == temp); } filteredList = filteredList.Where(predicate).ToList(); 但它給了我以下錯誤 'System.Collections.Generic.List '不包含'Where'的定義。 在這方面的任何幫助... – Kash

+0

你有包含System.Linq命名空間嗎? –

+0

是的,我已經包含System.Linq – Kash