我正在使用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?
您的时间和你的指导非常感谢。
谢谢 - 我很欣赏指针。 – DarenMay 2010-08-29 14:16:03