2009-11-03 43 views
0

我在使用LINQ設置域服務調用中的查詢的where子句時遇到問題。域服務調用的Where子句

如果我沒有設置where子句,它工作得很好,我在我完成的事件中得到了我的結果(我僅在已完成的事件中實現了事件處理程序來演示我的問題)。

LoadOperation<User> load = 
    _Context.Load(_Context.GetUsersQuery()); 
load.Completed += (se, ea) => 
    MyList.ItemsSource = load.Entities.FirstOrDefault(); 

如果我在查詢中放置一個where子句,我只需要一個空列表。而where子句應該返回1行:)

LoadOperation<User> load = 
    _Context.Load(_Context.GetUsersQuery().Where(f => f.UserID == UserID)); 
load.Completed += (se, ea) => 
    MyList.ItemsSource = load.Entities.FirstOrDefault(); 

任何反饋將不勝感激!

回答

1

AFAIK我不認爲有可能把這樣的RIA服務查詢的where子句。您需要在服務中實現一個採用UserID並將where子句放在服務中的查詢中的方法。

這裏是Brad Abram's blog series on the subject一個例子:

public IQueryable<SuperEmployee> GetSuperEmployee(int employeeID) 
{ 
    return Context.GetEmployees().ToList() 
      .Where(emp => emp.EmployeeID == employeeID).AsQueryable(); 

} 
+0

你能告訴我會是怎樣的查詢,如果僱員被替換的IList employeeIds,我想找到employeeIds所有emp.employeeID。 ..我希望我很清楚我的問題 – Sumit 2012-01-25 09:52:06

+0

我認爲你應該發佈這個問題作爲一個問題,而不是一個評論。 – Bryant 2012-01-26 21:16:12

0

根據這一post

主叫RIA服務時 「在」 不是有效的語法。但是,您可以構建一個謂詞表達式,它完全符合「in」會做的事情。

用法:

var ids = new[] { 10, 20,30}; 
var inExpression = BuiltInExpression (ids); 

EntityQuery<Product> listQuery = 
    ProductContext.GetProductsQuery().Where(inExpression); 

支持代碼:

static Expression<Func<Product, bool>> BuiltInExpression(int[] ids) 
{ 
var inputExpression = Expression.Parameter(typeof(Product), "input"); 
var valueExpression = Expression.Property(inputExpression, s_propertyInfo); 
var inExpression = 
ids 
.Aggregate( 
default(Expression), 
(acc, v) => 
{ 
    var vExpression = Expression.Constant(v, typeof(int?)); 
    var compareExpression = Expression.Equal(valueExpression, vExpression); 
    if (acc == null) 
    { 
    return compareExpression; 
    } 
    return Expression.OrElse(acc, compareExpression); 
}); 

inExpression = inExpression ?? Expression.Constant(true); 
return Expression.Lambda<Func<Product, bool>>( 
    inExpression, 
    inputExpression 
); 

return inExpression; 

}