Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 按字符串字段名搜索_C#_.net_Linq_Expression - Fatal编程技术网

C# 按字符串字段名搜索

C# 按字符串字段名搜索,c#,.net,linq,expression,C#,.net,Linq,Expression,我需要建立搜索字符串字段名 例如,此代码: SearchProvider.Search(records, "First", "S2"); 应等于: SearchProvider.Search(records, x => x.First, "S2"); 问题:将字符串转换为Linq lambda表达式 如何执行此操作?您应该使用表达式将字符串转换为lambda表达式。lambda例如: public IQueryable<TModel> Search<TModel>

我需要建立搜索字符串字段名

例如,此代码:

SearchProvider.Search(records, "First", "S2");
应等于:

SearchProvider.Search(records, x => x.First, "S2");
问题:将字符串转换为Linq lambda表达式


如何执行此操作?

您应该使用
表达式将字符串转换为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;
}
publicIQueryable搜索(IQueryable模型、字符串选择器、字符串搜索)
{
var param=表达式参数(typeof(TModel),“x”);
var contains=Expression.Call(
Expression.PropertyOrField(参数,选择器),
“Contains”,null,表达式.常量(searchFor)
);
var谓词=Expression.Lambda(contains,param);
model=model.Where(谓词);
收益模型;
}
接下来,对于公平搜索,您应该做两件事:

  • 搜索任何对象,而不仅仅是字符串
  • 放下所有的弦
下面是一个例子:

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;
}
publicIQueryable搜索(IQueryable模型、字符串选择器、对象搜索)
{
var param=表达式参数(typeof(TModel),“x”);
var-tostring=Expression.Call(
Expression.PropertyOrField(参数,选择器),
“ToString”,空,空
);
var-tolower=Expression.Call(
tostring,
“ToLower”,空,空
);
var contains=Expression.Call(
托洛尔,
“Contains”,null,表达式.常量(searchFor)
);
var谓词=Expression.Lambda(contains,param);
model=model.Where(谓词);
收益模型;
}
祝你好运