0

我正在尝试执行以下操作,但我想根据传递给函数的参数进行过滤。以下代码完美运行。

public void Test()
{
    var clist = GetFilteredList("Scott");
}

public List<Customer> GetFilteredList1(string filterValue)
{
    IQueryable<Customer> returnQuery = GetAll();

    returnQuery = returnQuery.Where(x => x.FirstName.Contains(filterValue));

    return returnQuery.ToList();
}

我试图做的是这样的事情......

public void Test()
{
    var clist = GetFilteredList2("FirstName", "Scott");
}

public List<Customer> GetFilteredList2(string fieldName, string filterValue)
{
    IQueryable<Customer> returnQuery = GetAll();
    returnQuery = returnQuery
        .Where(x => x.GetType().GetProperty(fieldName).GetValue(x).ToString()
            .Contains(filterValue));                          

    return returnQuery.ToList();
}

我知道这不太正确,我怀疑我需要以某种方式使用 Expression 类来构建自定义表达式,但我不太确定如何。Expression 类中没有“Contains”或“Like”函数,那么我将如何为此构建自定义表达式?

4

2 回答 2

0

像下面的代码一样更改您的获取查询。

                returnQuery.Where(x => x.FirstName == "Scott").ToList();
于 2013-07-18T05:31:31.667 回答
0

我能够通过使用 System.Linq.Expressions 库来解决这个问题。像这样的东西:

public static Expression<Func<T, bool>> LikeLambdaString<T>(string propertyName, string value)
{
    var linqParam = Expression.Parameter(typeof(T), propertyName);
    var linqProp = GetProperty<T>(linqParam, propertyName);

    var containsFunc = Expression.Call(linqProp,
        typeof(string).GetMethod("Contains"),
        new Expression[] { Expression.Constant(value) });

    return Expression.Lambda<Func<T, bool>>(containsFunc,
        new ParameterExpression[] { linqParam });
}
于 2013-08-08T14:24:23.500 回答