2013-03-21 124 views
1

我使用XRM(早期綁定)類型在WCF的項目,所以我有機會到CRM模型,並可以使用LINQ查詢。但我一直運行到a problem described here,它是在where條款的限制,具體到XRM LINQ:可空濾器where子句

其中[條款限制]

條款的左側必須是屬性名和 該條款的右側必須是一個值。您不能將左側設置爲常量。子句兩邊的 不能是常量。

支持字符串函數包含,StartsWith,的endsWith,和平等。

當一個參數爲空時,一個要求不斷彈出的要求是,否則應該返回所有實體,否則應該返回參數過濾。但我想不到在不違反上述要求的情況下執行此操作的方法,或者編寫多個查詢來處理該情況爲空時的方法。

這是我的查詢中的一個例子,該typeFilter == null是這裏的問題是我用一個恆定的LHS。在我真正的代碼有指向typeFilter == null到另一個查詢保護條款,但我現在必須添加一個開始/結束日期過濾器(兩者可爲空),我無法表達我是多麼要編寫一個查詢每個組合的空白。

private IQueryable<EventInfo> getAllEvents(DataContext context, EventType? typeFilter) 
{ 
    return (
     from evt in context.new_eventSet 
     where 
     (evt.statecode == new_eventState.Active) && 
     (typeFilter == null || evt.new_EventType.Value == (int) typeFilter.Value) 
     select new EventInfo() 
     { 
      ID = evt.Id, 
      EventType = (EventType) evt.new_EventType.Value 
      ... 
     });    
} 

回答

1

如何:

if (typeFilter == null) 
{ 
     return (
     from evt in context.new_eventSet 
     where 
     (evt.statecode == new_eventState.Active) 
       select new EventInfo() 
     { 
      ID = evt.Id, 
      EventType = (EventType) evt.new_EventType.Value 
      ... 
     }); 
} 
else 
{ 
     return (
     from evt in context.new_eventSet 
     where 
     (evt.statecode == new_eventState.Active) && 
     evt.new_EventType.Value == (int) typeFilter.Value) 
     select new EventInfo() 
     { 
      ID = evt.Id, 
      EventType = (EventType) evt.new_EventType.Value 
      ... 
     }); 
} 
+0

問題是我現在必須除型過濾器添加一個開始/結束日期過濾器。編寫查詢與if/else語句來處理額外的過濾掉4次有點多 – 2013-03-21 11:47:41

+0

實際上超過3次,因爲我認爲你需要每個組合 – 2013-03-21 11:47:58

+0

我不認爲你需要的在括號*回報*聲明。 – 2013-03-21 21:39:21

1

我已經回答了我的問題!有時候你只需要一個地方在你得到它之前發泄你的問題。

的訣竅是不使用LINQ語法:如果你想使用LINQ的語法

private IQueryable<EventInfo> getAllEvents(DataContext context, EventType? typeFilter, DateTime? startDateFilter, DateTime? endDateFilter ) 
{ 
    var result = context.new_eventSet 
     // active records 
     .Where(evt => evt.statecode == new_eventState.Active)    
     // is publish-able 
     .Where(..etc..); 

    if (typeFilter != null) 
    { 
     // filter by type 
     result = result.Where(evt => evt.new_EventType.Value == (int) typeFilter.Value); 
    } 

    if(startDateFilter != null) 
    { 
     // filter by startDate 
     result = result.Where(evt => evt.new_StartDate > startDateFilter.Value); 
    } 

    if(endDateFilter != null) 
    { 
     // filter by endDate 
     result = result.Where(evt => evt.new_StartDate < endDateFilter.Value); 
    } 

    return result.Select(evt => new EventInfo() 
     { 
      ID = evt.Id, 
      EventType = (EventType) evt.new_EventType.Value, 
      ... 
     } );  
}