使用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();
任何反馈都将不胜感激!
答案 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;
}