域服务调用的Where子句

时间:2009-11-03 21:40:36

标签: silverlight wcf-ria-services

使用LINQ在域服务调用中为查询设置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();

任何反馈都将不胜感激!

2 个答案:

答案 0 :(得分:1)

AFAIK我不相信可以将where子句放在RIA Services查询上。您需要在服务中实现一个方法,该方法接受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();

}

答案 1 :(得分:0)

根据此post

调用RIA服务时,“in”不是有效语法。但是,您可以构建一个与“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;

}