动态查找的动态位置

时间:2014-02-03 17:06:03

标签: c# linq

我正在尝试进行搜索,动态构建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());
}

我如何同时完成这两项工作?我不打算试图变得棘手,我只想要可维护的代码。

1 个答案:

答案 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());
}