Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ查询将根据对任意数量实体的部分匹配返回什么结果';s场?_C#_Linq_Linq To Sql - Fatal编程技术网

C# LINQ查询将根据对任意数量实体的部分匹配返回什么结果';s场?

C# LINQ查询将根据对任意数量实体的部分匹配返回什么结果';s场?,c#,linq,linq-to-sql,C#,Linq,Linq To Sql,考虑以下代码,它表示尝试实现部分匹配。预期结果是查询实体和数据存储之间匹配的任何1个或多个字段的行 因此,如果您提供person.email,我们希望与之匹配,如果您提供person.email和person.FirstName,我们应该进一步过滤结果,以此类推 var results = from p in db.Persons where p.CrookBookUserName.Trim().Contains(person.Croo

考虑以下代码,它表示尝试实现部分匹配。预期结果是查询实体和数据存储之间匹配的任何1个或多个字段的行

因此,如果您提供person.email,我们希望与之匹配,如果您提供person.email和person.FirstName,我们应该进一步过滤结果,以此类推

        var results = from p in db.Persons
                      where p.CrookBookUserName.Trim().Contains(person.CrookBookUserName.Trim()) ||
                      p.email.Trim().Contains(person.email.Trim()) ||
                      p.FirstName.Trim().Contains(person.FirstName.Trim()) ||
                      p.LastName.Trim().Contains(person.LastName.Trim()) ||
                      p.phone.Trim().Contains(person.phone.Trim())
                      select p;

        return results;
不幸的是,这段代码总是返回数据库中的所有行。为什么,应该怎么解决


提前感谢。

person是否已填充所有字段?来自空电子邮件地址的
p.email.Trim()

在每个参数之前添加一个额外的
(!String.IsNullOrEmpty(..)&&
,虽然很详细,但如果这是问题所在,它将修复此问题

编辑重新评论:

是的,一个助手的方法或者其他什么可以帮上忙。。。差不多

public static bool ContainsIfNotEmptyTrimmed(this string source, string param)
{
    return !String.IsNullOrEmpty(param.Trim()) && source.Trim().Contains(param.Trim());
}

where p.CrookBookUserName.ContainsIfNotEmptyTrimmed(person.CrookBookUserName) || ...

您需要检查用户是否提供空字符串

var query = db.Persons;
if (!string.IsNullOrEmpty(person.CrookBookUserName.Trim()) {
    query = query.Where(p => p.CrookBookUserName.Trim().Contains(person.CrookBookUserName.Trim()));
}
if (!string.IsNullOrEmpty(person.email.Trim()) {
    query = query.Where(p => p.email.Trim().Contains(person.email.Trim()));
}
// etc...

return query;

关于变量命名的注意事项:您没有返回任何结果,而是返回一个查询对象。非常感谢,这为工作代码指明了方向:我希望用户能够提供尽可能多的字段,以及任意数量的部分字符串。这很冗长,但我不在乎。话虽如此,lamda表达式能否修复详细性?这是固定的代码:var results=from p in db.Persons,其中(!String.IsNullOrEmpty(person.crokbookousername))&&p.crokbookousername.Trim().Contains(person.crokbookousername.Trim())|(!String.IsNullOrEmpty(person.email))&&p.email.Trim().Contains(person.email.Trim())||((!String.IsNullOrEmpty(person.FirstName))&&p.FirstName.Trim().Contains(person.FirstName.Trim())| |((!String.IsNullOrEmpty(person.LastName))&&p.LastName.Trim().Contains(person.LastName.Trim())|(!String.IsNullOrEmpty(person.phone))&&p.phone.Trim().Contains(person.phone.phone.Trim())选择p;return results;@user283989:edited使用一个简单的扩展方法。它并没有真正正确地执行null检查,但我相信如果这是一个问题,您可以毫不费力地解决该部分。:)谢谢:您的答复提醒我,您可以以这种方式在查询中连接子句。