动态构建Linq查询

时间:2013-10-28 17:24:48

标签: linq expression-trees

我正在编写实现关键字式搜索的LINQ查询。换句话说,返回TitleDescriptionId包含

的行的查询

如下

    public static IQueryable<EmployeeObject> QueryableSQL()
    {
        IQueryable<EmployeeObject> queryable = EmployeeRepository.GetAllEmployee(); 
    }

    public static IList<EmployeeObject> QLike(string txt)
    {
       IList<employeeObject> _emps = QueryableSQL().Where(x => x.Title == txt).ToList();
       return _emps;
    }

到目前为止,这么好。但是这只处理了我想要匹配Title的情况。

相反,假设我想根据“说明or Id should i have to create a new method for Description? or is there a way i can create a树表达式”进行搜索

3 个答案:

答案 0 :(得分:3)

public static IQueryable<EmployeeObject> QueryableSQL()
{
    IQueryable<MediaObject> queryable = EmployeeRepository.GetAllEmployee(); 
}

public static IList<EmployeeObject> QLike(Expression<Func<EmployeeObject, bool>> func)
{
   return QueryableSQL().Where(func).ToList();
}

然后你可以这样称呼:

QLike(t => t.Title == "MyText");

答案 1 :(得分:2)

你看过Dynamic Linq了吗?也就是说,如果这个文本可能是用户提供的而不是编译的。

答案 2 :(得分:2)

听起来你想通过动态比较你要比较的属性,你可以使用反射来做到这一点:

public static IList<EmployeeObject> QLike(string propName, string txt)
{
   PropertyInfo filterProp = typeof(EmployeeObject).GetProperty(propName);
   IList<employeeObject> _emps = QueryableSQL().Where(x => filterProp.GetValue(x, null).ToString() == txt).ToList();
   return _emps;
}

然而,这种方法的缺点是,您最终将从数据库加载所有对象,然后在代码中过滤它们。

如果你遵循@gleng显示的方法,那么Ling to SQL提供的将能够在生成的SQL语句中进行过滤。在这种情况下,您需要预先对谓词进行编码,并根据您要调用的属性调用相应的谓词。