0

我在使用 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();

对于任何反馈,我们都表示感谢!

4

2 回答 2

1

AFAIK 我不相信可以将 where 子句放在这样的 RIA 服务查询上。您需要在服务中实现一个方法,该方法采用 UserID 并将 where 子句放在服务中的查询上。

以下是Brad Abram 关于该主题的博客系列中的一个示例:

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

}
于 2009-11-03T22:01:42.687 回答
0

根据这个帖子

调用 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;

}
于 2013-05-12T06:51:55.310 回答