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

C# LINQ函数用于在将字符串输入查询之前检查字符串是否存在,c#,.net,linq,C#,.net,Linq,我目前有一个查询(这里是psuedo代码!),例如: var query = p.Companies.Any((a => a.Name != "" || a.Name.Contains(variable1) && (a => a.Description != "" || a.Description.Contains(variable2)); 现在,很明显,这是我试图做的一个简化版本,因为有更多的字段需要我检查,

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

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
表达式公司查询;
如果(!String.IsNullOrEmpty(variable1)){
//增强我的表情
}
//完成后将表达式传递给查询

有什么想法吗?谢谢

您可能不需要这样做。您可以信任数据库在执行查询之前为您优化查询,因此这不太可能是一个问题

也就是说,是的,你能做到,而且也没那么难。(如果表达式与或语义相结合,则需要做更多的工作

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();
IQueryable query=p.companys.AsQueryable();
如果(!string.IsNullOrEmpty(variable1))
query=query.Where(company=>company.Name!=“company.Name.Contains(variable1));
如果(!string.IsNullOrEmpty(variable2))
query=query.Where(company=>company.Description!=“company.Description.Contains(variable1));
bool result=query.Any();

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

您可能不需要这样做。您可以信任数据库在执行查询之前为您优化查询,所以这不太可能是一个问题

也就是说,是的,你可以做到,而且也不难。(如果表达式与或语义相结合,这将需要更多的工作。)

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();
IQueryable query=p.companys.AsQueryable();
如果(!string.IsNullOrEmpty(variable1))
query=query.Where(company=>company.Name!=“company.Name.Contains(variable1));
如果(!string.IsNullOrEmpty(variable2))
query=query.Where(company=>company.Description!=“company.Description.Contains(variable1));
bool result=query.Any();

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

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

IQueryable<Company> query = p.Companies;

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

if (condition2)
{
    query = query.Where(expression2);
}
IQueryable查询=p.公司;
如果(条件1)
{
query=query.Where(表达式1);
}
如果(条件2)
{
query=query.Where(表达式2);
}

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

IQueryable<Company> query = p.Companies;

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

if (condition2)
{
    query = query.Where(expression2);
}
IQueryable查询=p.公司;
如果(条件1)
{
query=query.Where(表达式1);
}
如果(条件2)
{
query=query.Where(表达式2);
}

你应该使用而不是!=“”。你对每个属性都有相同的验证吗?对不起,我在我的实时代码中使用了String.IsNullOrEmpty,我只是写了一些草率的伪代码来说明目的:)是的,每个属性都是一样的,因此生成的SQL与它应该使用的内容相比非常混乱。你应该使用而不是!=“”。您对每个属性都有相同的验证吗?抱歉,我在我的实时代码中使用了String.IsNullOrEmpty,我只是编写了草率的伪代码来说明目的:)是的,每个属性都有相同的验证,因此生成的SQL与它应该的样子相比非常混乱。