2010-08-27 47 views
1

我正在使用SL 4,WCF RIA服務對實體框架4.0。我有一個實體,訪問,它有一個字符串狀態字段。我有一個搜索屏幕,我需要顯示具有StatusA或StatusB的結果。我正在努力尋找一種方法來指定一個客戶端查詢,該查詢指定了應該匹配的狀態集合。如果我是寫我想要的東西在SQL它看起來是這樣的:RIA服務 - 如何WhereOr或使用IN樣式構造

select * from Visit where Status in ('StatusA', 'StatusB'); 

客戶端,這似乎是直接的鏈,其中一個WhereAnd效果的方法:

 var query = this.PqContext.GetVisitsQuery(); 

     if (!string.IsNullOrEmpty(this.PracticeName)) 
     { 
      query = query.Where(v => v.PracticeName.ToUpper().Contains(this.PracticeName.ToUpper())); 
     } 

     if (this.VisitDateAfter.HasValue) 
     { 
      query = query.Where(v => v.VisitDate > this.VisitDateAfter); 
     } 

     if (this.VisitDateBefore.HasValue) 
     { 
      query = query.Where(v => v.VisitDate < this.VisitDateBefore); 
     } 

然而,我似乎無法找到執行WhereOr風格操作的直接方法。我曾經嘗試這樣做:

 var statuses = new List<string>(); 

     if (this.ShowStatusA) 
     { 
      statuses.Add("StatusA"); 
     } 

     if (this.ShowStatusB) 
     { 
      statuses.Add("StatusB"); 
     } 

     if (statuses.Any()) 
     { 
      query = query.Where(BuildContainsExpression<Visit, string>(e => e.Status, statuses)); 
     } 

凡BuildContainsExpression的樣子:「位運算符中不支持查詢」

 private static Expression<Func<TElement, bool>> BuildContainsExpression<TElement, TValue>(Expression<Func<TElement, TValue>> valueSelector, IEnumerable<TValue> values) 
    { 

     if (null == valueSelector) 
     { 
      throw new ArgumentNullException("valueSelector"); 
     } 

     if (null == values) 
     { 
      throw new ArgumentNullException("values"); 
     } 

     ParameterExpression p = valueSelector.Parameters.Single(); 
     if (!values.Any()) 
     { 
      return e => false; 
     } 

     var equals = 
      values.Select(
       value => 
       (Expression)Expression.Equal(valueSelector.Body, Expression.Constant(value, typeof(TValue)))); 

     var body = equals.Aggregate<Expression>(Expression.Or); 

     return Expression.Lambda<Func<TElement, bool>>(body, p); 
    } 

但是,這將引發例外。任何線索?有沒有其他的方法來構建一個在此工作的表達式樹,還是需要將所有參數傳遞給服務器並在那裏使用BuildContainsExpression?

您的時間和你的指導非常感謝。

回答

1

您可以創建一個查詢方法,如您的域名服務如下:

GetVisitsByStatus(string[] statusList) { 
    // create the LINQ where clause here 
} 

然後從客戶端,調用context.GetVistsByStatusQuery(字符串[])。

並非所有的LINQ都可以通過URL公開,甚至可以通過URL公開,所以總會有一些情況需要使用簡單的參數,並且中間層構造LINQ表達式,最終定義查詢後端數據存儲。

希望有所幫助。

+0

謝謝 - 我很欣賞指針。 – DarenMay 2010-08-29 14:16:03