所以当我写c# linq语句时,我经常想这样做:
string name = database.table.Where(t=>t.Field1 == row.Field1 && t.Field2 == row.Field).Select(b=> b.Name).FirstOrDefault().ToString();
然而,如果上面的语句没有返回任何东西,那么它就会出错,因为你不能对空值使用。firstordefault()。
所以我通常会这样做:
var listOfNames = database.table.Where(t=>t.Field1 == row.Field1 && t.Field2 == row.Field).Select(b=> b.Name).ToList();
if(listOfNames.Count() > 0 ){
string name = listOfNames.FirstOrDefault().ToString();
}
上面的代码看起来真的很冗长,我不得不想象在处理潜在的null返回值时有一种更简洁的方法。
任何见解或帮助将不胜感激。谢谢。
您有几种方法:
- 不使用
ToString()
,我猜名称是字符串/varchar已经
string name = database.table
.Where(t=>t.Field1 == row.Field1 && t.Field2 == row.Field)
.Select(b=> b.Name)
.FirstOrDefault()
// name now can be null since default(string) is null
- 如果你需要做
ToString
,那么你可以使用c# 6的特性-空条件(?.)
string name = database.table
.Where(t=>t.Field1 == row.Field1 && t.Field2 == row.Field)
.Select(b=> b.Name)
.FirstOrDefault()?.ToString(); // here ?
// name now can be null
- 还考虑空合并(??)操作符
string name = database.table
.Where(t=>t.Field1 == row.Field1 && t.Field2 == row.Field)
.Select(b=> b.Name)
.FirstOrDefault() ?? "some value"
// so if FirstOrDefault returns null then "some value" will be used
合并.Where
和.FirstOrDefault
:
string name = database.table
.FirstOrDefault(t=>t.Field1 == row.Field1 && t.Field2 == row.Field)
?.Name;