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