我正在尝试进行搜索,动态构建Where
子句并动态查找字段。 Dictionary
包含字段名称作为键及其值。
由于x
的关闭,我认为这失败了。错误是:
在linq表达式中检测到循环
代码:
public List<CustomerView> Search(Dictionary<string, string> criteria)
{
var x = (from a in base.DbContext.vCustomers
select a);
foreach (var criterion in criteria)
{
x = x.Where(c => c.GetType().GetProperty(criterion.Key).GetValue(x).ToString() == criterion.Value);
}
return base.Convert<List<CustomerView>>(x.ToList());
}
我如何同时完成这两项工作?我不打算试图变得棘手,我只想要可维护的代码。
答案 0 :(得分:5)
您需要动态构造Expression
对象,而不是使用反射(因为查询提供程序将无法将该反射代码转换为SQL)。您可以使用此方法创建表达式:
public static Expression<Func<T, bool>> PropertyEquals<T>(
string propertyName, string valueToCompare)
{
var param = Expression.Parameter(typeof(T));
var body = Expression.Equal(Expression.Property(param, propertyName),
Expression.Constant(valueToCompare));
return Expression.Lambda<Func<T, bool>>(body, param);
}
代码变为:
public List<CustomerView> Search(Dictionary<string, string> criteria)
{
var x = base.DbContext.vCustomers.AsQueryable();
foreach (var criterion in criteria)
{
x = x.Where(PropertyEquals<CustomerView>(
criterion.Key, criterion.Value));
}
return base.Convert<List<CustomerView>>(x.ToList());
}