C# 通过linq比较无值

C# 通过linq比较无值,c#,linq,C#,Linq,我在SQLServer2008数据库/表中有一个整数列(非空),我想检索它 // go to the table and get the largest number, if none exists, use 0. int iNumber = iContext.DetailsRecords.Max(x => x.Number); // from entity 但一开始,桌子是空的。我想设置为0。 如何更改代码?试试这个: int iNumber=iContext.De

我在SQLServer2008数据库/表中有一个整数列(非空),我想检索它

  // go to the table and get the largest number, if none exists, use 0.
        int iNumber = iContext.DetailsRecords.Max(x => x.Number); // from entity
但一开始,桌子是空的。我想设置为0。 如何更改代码?

试试这个:
int iNumber=iContext.DetailsRecords==null?iContext.DetailsRecords.Max(x=>x.Number):0

int iNumber=iContext.DetailsRecords.Any()?iContext.DetailsRecords.Max(x=>x.Number):0如果表不为空且包含0条记录。

请尝试以下操作:
int iNumber=iContext.DetailsRecords==null?iContext.DetailsRecords.Max(x=>x.Number):0


int iNumber=iContext.DetailsRecords.Any()?iContext.DetailsRecords.Max(x=>x.Number):0如果表不为空且包含0条记录。

您可以为此使用
DefaultIfEmpty
。如果序列为空,则返回提供的项作为序列中的唯一项,否则返回原始序列

IEnumerable<int> numbers = new int [] { };

numbers.DefaultIfEmpty(0).Max();
IEnumerable numbers=newint[]{};
numbers.DefaultIfEmpty(0.Max();

您可以为此使用
DefaultIfEmpty
。如果序列为空,则返回提供的项作为序列中的唯一项,否则返回原始序列

IEnumerable<int> numbers = new int [] { };

numbers.DefaultIfEmpty(0).Max();
IEnumerable numbers=newint[]{};
numbers.DefaultIfEmpty(0.Max();

使用
Any
功能查看是否有任何记录:

int iNumber = iContext.DetailsRecords.Any() 
              ? iContext.DetailsRecords.Max(x => x.Number) 
              : 0;

使用
Any
功能查看是否有任何记录:

int iNumber = iContext.DetailsRecords.Any() 
              ? iContext.DetailsRecords.Max(x => x.Number) 
              : 0;

如果您不想检查DetailsRecords是否为null,而是想处理源序列是否为空,那么请使用此答案(我根据LINQ使用情况对其进行了稍微不同的调整):


int iNumber=iContext.DetailsRecords.Select(x=>(int?)x.Number).Max()??0;

  • :无效操作例外- 源不包含任何元素
  • :如果源序列为空或仅包含null值,则此函数返回null

如果您不想检查DetailsRecords是否为null,而是想处理源序列是否为空,那么请使用此答案(我针对您的LINQ使用情况对其进行了稍微不同的调整):


int iNumber=iContext.DetailsRecords.Select(x=>(int?)x.Number).Max()??0;

  • :无效操作例外- 源不包含任何元素
  • :如果源序列为空或仅包含null值,则此函数返回null

我知道这已经有了一个公认的答案,但另一个好方法就是FirstOrDefault()

我经常使用这种方法,如果结果为空,还可以让您设置一个新对象

 MyObject m = mySearch.GetItems.Where(a => a.id == id).FirstOrDefault() ?? new MyObject();

我知道这已经有了一个公认的答案,但另一个好方法就是FirstOrDefault()

我经常使用这种方法,如果结果为空,还可以让您设置一个新对象

 MyObject m = mySearch.GetItems.Where(a => a.id == id).FirstOrDefault() ?? new MyObject();

我不确定这是否是他的要求,但我给了你+1以防万一。不过,我有一种感觉,那就是细节记录中没有任何元素。我不确定这是否是他想要的,但如果是的话,我给了你+1。尽管如此,我感觉DetailsRecords不包含任何元素。可能重复:可能重复:+1,但我怀疑这需要是
iContext.DetailsRecords.Select(x=>x.Number).DefaultIfEmpty(0.Max()@ReedCopsey是的,但我不认为他从我提供的东西到那里有太大的飞跃。并不是所有的代码答案都需要复制/粘贴/完成才能回答这个问题。我只是想指出一下,因为除了原始的+您的编辑+1之外,它实际上还需要另一个概念性的添加(通过选择的映射操作),但我怀疑这需要
iContext.DetailsRecords.select(x=>x.Number).DefaultIfEmpty(0).Max();@ReedCopsey是的,但我不认为他从我提供的东西到那里有太大的飞跃。不是所有的代码答案都需要复制/粘贴/完成才能回答这个问题。我只是想指出一下,因为除了原始的+您的编辑之外,它实际上还需要另一个概念性的添加(通过选择的映射操作)。@Servy:错了<空序列的code>Max(IEnumerable)
引发异常<空序列的code>Max(IEnumerable)
返回null。施法是有效的解决方案(已接受重复答案)。@Servy:错误<空序列的code>Max(IEnumerable)
引发异常<空序列的code>Max(IEnumerable)
返回null。强制转换是一个有效的解决方案(已接受的重复答案)。这将在达到
Max(…)
方法时引发异常。正在演示如何使用FirstOrDefault的示例。。。修复了反映OrderByDescending的代码,因此在本例中可以正常工作。将OrderByDescending与FirstOrDefault一起使用是一个有趣的尝试。。。答案越多,越快乐:)这将在到达
Max(…)
方法时引发异常。正在演示如何使用FirstOrDefault的示例。。。修复了反映OrderByDescending的代码,因此在本例中可以正常工作。将OrderByDescending与FirstOrDefault一起使用是一个有趣的尝试。。。答案越多,越开心:)