我目前有一个查询(此处为伪代码!),例如:
var query = p.Companies.Any((a => a.Name != "" || a.Name.Contains(variable1) &&
(a => a.Description != "" || a.Description.Contains(variable2));
现在,显然这是我正在尝试做的简化版本,因为我需要检查更多字段,但我的答案的基础是 - 我可以创建一个以这样的方式构建的函数/表达式它只生成它需要的SQL的方式吗?
如:
Expression<Func<Company, bool>> companyQuery;
if(!String.IsNullOrEmpty(variable1)) {
// build up my expression
}
// Pass expression through to query when finalized
有关于此的任何想法吗?谢谢!
答案 0 :(得分:5)
你可能不需要。在执行之前,您可以信任数据库为您优化查询,因此不太可能出现问题。
那说,是的,你可以做到,而且也不是那么难。 (如果表达式与OR语义相结合,那将会有更多的工作。
IQueryable<Company> query = p.Companies.AsQueryable();
if(!string.IsNullOrEmpty(variable1))
query = query.Where(company => company.Name != "" || company.Name.Contains(variable1));
if(!string.IsNullOrEmpty(variable2))
query = query.Where(company => company.Description != "" || company.Description .Contains(variable1));
bool result = query.Any();
这是我发现在高级搜索屏幕上经常使用的模式。如果他们正在搜索此字段,请在此字段上进行过滤,如果他们没有在此字段上进行过滤,请不要包含该字段。
答案 1 :(得分:1)
您可以使用IQueryable
类按需构建查询,例如:
IQueryable<Company> query = p.Companies;
if (condition1)
{
query = query.Where(expression1);
}
if (condition2)
{
query = query.Where(expression2);
}