我在 sql server 2008 数据库/表中有一个整数列(非空),我想检索它。
// 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。如何更改代码?
如果您不想检查 DetailsRecords 是否为空,而是想处理源序列是否为空,请使用此答案(我根据您的 LINQ 使用情况对其进行了一些不同的调整):
int iNumber = iContext.DetailsRecords.Select(x => (int?)x.Number).Max() ?? 0;
Enumerable.Max Method (IEnumerable<Int32>)
: InvalidOperationException - 源不包含任何元素。Enumerable.Max Method (IEnumerable<Nullable<Int32>>)
:如果源序列为空或仅包含 null 值,则此函数返回 null。试试这个:
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();
使用Any
函数查看是否有记录:
int iNumber = iContext.DetailsRecords.Any()
? iContext.DetailsRecords.Max(x => x.Number)
: 0;
我知道这已经有一个公认的答案,但另一个好方法就是 FirstOrDefault()。
int iNumber = iContext.DetailsRecords.OrderByDescending(x => x.Number).FirstOrDefault();
我经常使用这种方式,如果结果为空,也可以让你设置一个新对象。
MyObject m = mySearch.GetItems.Where(a => a.id == id).FirstOrDefault() ?? new MyObject();