1

我需要按字符串字段名称构建搜索。

例如这段代码:

SearchProvider.Search(records, "First", "S2");

应该等于:

SearchProvider.Search(records, x => x.First, "S2");

问题:将字符串转换为 Linq lambda 表达式。

我怎么能做到这一点?

4

1 回答 1

2

Expression.Lambda您应该使用例如将字符串转换为 lambda 表达式:

public IQueryable<TModel> Search<TModel>(IQueryable<TModel> model, string selector, string searchFor)
{
    var param = Expression.Parameter(typeof(TModel), "x");
        var contains = Expression.Call(
            Expression.PropertyOrField(param, selector),
            "Contains", null, Expression.Constant(searchFor)
        );
        var predicate = Expression.Lambda<Func<TModel, bool>>(contains, param);

        model = model.Where(predicate);
    return model;
}

接下来为了公平搜索,您应该做两件事:

  • 搜索任何对象,而不仅仅是字符串。
  • 放下所有琴弦。

这是示例:

public IQueryable<TModel> Search<TModel>(IQueryable<TModel> model, string selector, object searchFor)
{
    var param = Expression.Parameter(typeof(TModel), "x");
    var tostring = Expression.Call(
        Expression.PropertyOrField(param, selector),
        "ToString", null, null
        );
    var tolower = Expression.Call(
        tostring,
        "ToLower", null, null
        );
    var contains = Expression.Call(
        tolower,
        "Contains", null, Expression.Constant(searchFor)
                );
    var predicate = Expression.Lambda<Func<TModel, bool>>(contains, param);

    model = model.Where(predicate);

        return model;
}

祝你好运。

于 2013-08-25T22:12:51.947 回答