我正在编写实现关键字式搜索的LINQ查询。换句话说,返回Title
,Description
,Id
包含
如下
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
树表达式”进行搜索
答案 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语句中进行过滤。在这种情况下,您需要预先对谓词进行编码,并根据您要调用的属性调用相应的谓词。