1

我目前有一个查询(这里是伪代码!),例如:

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

有什么想法吗?谢谢!

4

2 回答 2

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();

这是我发现在高级搜索屏幕上经常使用的一种模式。如果他们正在搜索此字段,请过滤此字段,如果他们未过滤此字段,请不要包含它。

于 2013-01-10T15:25:07.637 回答
1

您可以使用该类按需构建查询IQueryable,例如:

IQueryable<Company> query = p.Companies;

if (condition1)
{
    query = query.Where(expression1);
}

if (condition2)
{
    query = query.Where(expression2);
}
于 2013-01-10T15:25:58.453 回答