LINQ函数用于在将字符串输入查询之前检查字符串是否存在

时间:2013-01-10 14:58:25

标签: c# .net linq

我目前有一个查询(此处为伪代码!),例如:

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

有关于此的任何想法吗?谢谢!

2 个答案:

答案 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);
}