C# 如何使用LINQ中的where子句处理空值?

C# 如何使用LINQ中的where子句处理空值?,c#,linq,C#,Linq,我有两个实体,其中我Groupjoin将它们加入到一个列表中,我正在尝试搜索不同属性中某个值的匹配项。 问题是,如果一个属性在列表中有空值,搜索将完全忽略其他属性并返回空列表 我正在发布相关代码 填充实体, List<PatientsRegistrySearchViewModel> SearchList = new List<PatientsRegistrySearchViewModel>(); List<PatientsRegistrySearchViewMod

我有两个实体,其中我
Groupjoin
将它们加入到一个列表中,我正在尝试搜索不同属性中某个值的匹配项。 问题是,如果一个属性在列表中有空值,搜索将完全忽略其他属性并返回空列表

我正在发布相关代码

填充
实体

List<PatientsRegistrySearchViewModel> SearchList = new List<PatientsRegistrySearchViewModel>(); 
List<PatientsRegistrySearchViewModel> DataResponse = new List<PatientsRegistrySearchViewModel>();
我的搜索逻辑

searchResults = (from i in SearchList where (
    i.Name.ToLower().Contains (value.ToLower()) ||
    i.PatientEmail.ToLower ().Contains (value.ToLower())
) select i).ToList();
此搜索逻辑将该值与
Name
PatientEmail
进行比较,如果列表中的任何一个prop为null,则返回的结果为空!为什么(| |)或“运算符不跳过null?”

举个例子

{
patientFileId: 1111,
Name: "John",
aliasName: null,
patientDob: "1/25/85 12:00:00 AM",
patientAge: 0,
patientEmail: "aamaizar@gmail.com",
socialSecurityNo: "1212121SSN",
patientMobileNo: "3244990"
},
{
patientFileId: 2222,
Name: "Nicole",
aliasName: null,
patientDob: "1/1/01 12:00:00 AM",
patientAge: 0,
patientEmail: null,
socialSecurityNo: null,
patientMobileNo: null
},
{
patientFileId: 3333,
Name: "Nancy",
aliasName: null,
patientDob: "3/25/85 12:00:00 AM",
patientAge: 0,
patientEmail: "aamaizar@gmail.com",
socialSecurityNo: null,
patientMobileNo: "3244990"
}

|
运算符加上
字符串.IsNullOrWhiteSpace
将包括
null
的值。然后尝试对
null
值执行
ToLower()

试试这个。它将首先确保电子邮件的有效期不为空,然后执行包含操作

searchResults = (from i in SearchList where (
    i.Name.ToLower ().Contains (value.ToLower ()) ||
    (!string.IsNullOrWhiteSpace (i.PatientEmail) &&
    i.PatientEmail.ToLower ().Contains (value.ToLower ()))
) select i).ToList ();

|
运算符加上
字符串.IsNullOrWhiteSpace
将包括
null
的值。然后尝试对
null
值执行
ToLower()

试试这个。它将首先确保电子邮件的有效期不为空,然后执行包含操作

searchResults = (from i in SearchList where (
    i.Name.ToLower ().Contains (value.ToLower ()) ||
    (!string.IsNullOrWhiteSpace (i.PatientEmail) &&
    i.PatientEmail.ToLower ().Contains (value.ToLower ()))
) select i).ToList ();
例如:

AliasName = p.AliasName,
取代

AliasName = p.AliasName ?? ""
当p.AliasName为null时,则AliasName为空字符串。

例如:

AliasName = p.AliasName,
取代

AliasName = p.AliasName ?? ""

当p.AliasName为null时,那么AliasName是一个空字符串。

好的,我做了一个小测试,确定了我的猜测。 代码段:

class Program
{
    static void Main(string[] args)
    {
        var searchList = new List<TwoProps>()
        {
            new TwoProps() {Name = "sdfs1", PatientEmail="mymail@sf.com" },
            new TwoProps() {Name = "sdfs2", PatientEmail=null },
            new TwoProps() {Name = "sdfs3", PatientEmail="mymail2@sf.com" }
        };

        var stringToSearch = "myMail".ToLower();
        var query = (from listItem in searchList
                    where listItem.Name.ToLower().Contains(stringToSearch)
                        || listItem.PatientEmail.ToLower().Contains(stringToSearch)
                    select listItem).ToList(); //NullReferenceException is thrown here @ second element
        //listItem.PatientEmail.ToLower() => null.ToLower() => NRE

        Console.WriteLine(query.Count());
    }

    private class TwoProps
    {
        public string Name { get; set; }
        public string PatientEmail { get; set; }
    }
}
类程序
{
静态void Main(字符串[]参数)
{
var searchList=新列表()
{
新建TwoProps(){Name=“sdfs1”,PatientEmail=”mymail@sf.com" },
新建TwoProps(){Name=“sdfs2”,PatientEmail=null},
新建TwoProps(){Name=“sdfs3”,PatientEmail=”mymail2@sf.com" }
};
var stringToSearch=“myMail.ToLower();
var query=(来自searchList中的listItem)
其中listItem.Name.ToLower()包含(stringToSearch)
||listItem.PatientMail.ToLower()包含(stringToSearch)
选择listItem).ToList();//在此处@second元素引发NullReferenceException
//listItem.PatientEmail.ToLower()=>null.ToLower()=>NRE
Console.WriteLine(query.Count());
}
私人类道具
{
公共字符串名称{get;set;}
公共字符串PatientEmail{get;set;}
}
}
您可以使用
…||(listItem.PatientEmail?.ToLower().Contains(stringToSearch)??false)
修复此问题


正如所料,会抛出一个NRE。您正在某处处理异常并返回一个空列表,或者干脆不使用结果项填充列表(结果相同)。

好的,我做了一个小测试,确定了我的猜测。 代码段:

class Program
{
    static void Main(string[] args)
    {
        var searchList = new List<TwoProps>()
        {
            new TwoProps() {Name = "sdfs1", PatientEmail="mymail@sf.com" },
            new TwoProps() {Name = "sdfs2", PatientEmail=null },
            new TwoProps() {Name = "sdfs3", PatientEmail="mymail2@sf.com" }
        };

        var stringToSearch = "myMail".ToLower();
        var query = (from listItem in searchList
                    where listItem.Name.ToLower().Contains(stringToSearch)
                        || listItem.PatientEmail.ToLower().Contains(stringToSearch)
                    select listItem).ToList(); //NullReferenceException is thrown here @ second element
        //listItem.PatientEmail.ToLower() => null.ToLower() => NRE

        Console.WriteLine(query.Count());
    }

    private class TwoProps
    {
        public string Name { get; set; }
        public string PatientEmail { get; set; }
    }
}
类程序
{
静态void Main(字符串[]参数)
{
var searchList=新列表()
{
新建TwoProps(){Name=“sdfs1”,PatientEmail=”mymail@sf.com" },
新建TwoProps(){Name=“sdfs2”,PatientEmail=null},
新建TwoProps(){Name=“sdfs3”,PatientEmail=”mymail2@sf.com" }
};
var stringToSearch=“myMail.ToLower();
var query=(来自searchList中的listItem)
其中listItem.Name.ToLower()包含(stringToSearch)
||listItem.PatientMail.ToLower()包含(stringToSearch)
选择listItem).ToList();//在此处@second元素引发NullReferenceException
//listItem.PatientEmail.ToLower()=>null.ToLower()=>NRE
Console.WriteLine(query.Count());
}
私人类道具
{
公共字符串名称{get;set;}
公共字符串PatientEmail{get;set;}
}
}
您可以使用
…||(listItem.PatientEmail?.ToLower().Contains(stringToSearch)??false)
修复此问题



正如所料,会抛出一个NRE。您正在某处处理异常并返回一个空列表,或者只是不使用结果项填充列表(结果相同)。

似乎没有涉及EF。您是否遗漏了部件,或者可以删除标记?如果您确实使用列表,那么EF Core与此没有任何共同之处。如果某个属性为
null
prop.ToLower()。包含(value.ToLower()
只会生成NRE。那你为什么不展示你的真实案例呢?@IvanStoev,我正在移除ef-core2.0标签,你是对的,它的
LINQ
问题,我很抱歉。如果你想得到好的答案,你应该尝试更好地格式化你的LINQ查询。这次我为你做了这件事。@Sefe,非常感谢,尝试使用这件事ot似乎与EF有关。您是否遗漏了部件,或者可以删除标记?如果您确实使用列表,则EF Core没有任何共同之处。如果某些属性为
null
prop.ToLower()。包含(value.ToLower()
只会生成NRE。那你为什么不展示你的真实案例呢?@IvanStoev,我正在删除ef-core2.0标签,你是对的,它的
LINQ
问题,我很抱歉。如果你想要好的答案,你应该尝试更好地格式化你的LINQ查询。这次我为你做了这件事。@Sefe,非常感谢,尝试使用这个查询来做这件事请查看
searchResults
query,查询上下文中不包括
AliasName
prop。我不谈论变量searchResults。选择新的是您的问题。您将p.AliasName映射到变量AliasName(PatientsRegistrySearchViewModel)。在映射中不进行空检查。进行此操作??若要通过空获取,默认为空字符串。查询不在
AliasName
prop中查找您的意思请查看
searchResults
query,
AliasName
pro