简体   繁体   English

C# LINQ 如何高效处理 null 退货?

[英]C# LINQ How to efficiently deal with a null return?

So when I'm writing C# linq statements I often would like to do something like this:所以当我写 C# linq 语句时,我经常想做这样的事情:

string name = database.table.Where(t=>t.Field1 == row.Field1 && t.Field2 == row.Field).Select(b=> b.Name).FirstOrDefault().ToString();

However if the statement above doesn't return anything then it errors because you can't use.FirstOrDefault() on a null value.但是,如果上面的语句没有返回任何内容,那么它会出错,因为您不能在 null 值上使用.FirstOrDefault()。

So what I usually end up doing instead is something like below:所以我通常最终会做的是如下所示:

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();
}

The code above just seems really verbose and I have to imagine there is a much cleaner way of doing this while dealing with a potential null return value.上面的代码看起来真的很冗长,我不得不想象在处理潜在的 null 返回值时有一种更简洁的方法。

Any insight or help would be appreciated.任何见解或帮助将不胜感激。 Thanks.谢谢。

You have a few ways:你有几种方法:

  1. do not use ToString() I guess Name is string/varchar already不要使用ToString()我猜 Name 已经是 string/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
  1. if you need to do ToString then you can use C# 6 features – Null-conditional (?.)如果你需要做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
  1. also consider null-coalescing (??) operator还考虑空合并 (??) 运算符
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

Combine the .Where and .FirstOrDefault :结合.Where.FirstOrDefault

string name = database.table
  .FirstOrDefault(t=>t.Field1 == row.Field1 && t.Field2 == row.Field)
  ?.Name;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM