【问题标题】:compare none value by linq通过 linq 比较无值
【发布时间】:2012-11-12 18:43:58
【问题描述】:

我在 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。 如何更改代码?

【问题讨论】:

标签: c# linq


【解决方案1】:

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

Max or Default?


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

【讨论】:

  • @Servy:错误。 Max(IEnumerable<int>) 的空序列会引发异常。 Max(IEnumerable<Nullable<int>>) 的空序列返回 null。强制转换是一个有效的解决方案(重复的答案已被接受)。
【解决方案2】:

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

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

numbers.DefaultIfEmpty(0).Max();

【讨论】:

  • +1,但我怀疑这需要iContext.DetailsRecords.Select(x =&gt; x.Number).DefaultIfEmpty(0).Max();
  • @ReedCopsey 是的,但我不认为他从我提供的东西到那里有太多的飞跃。并非所有代码答案都需要复制/粘贴/完成才能回答问题。
  • 好吧,我只是想指出这一点,因为它实际上需要另一个概念添加(通过选择的映射操作)除了原始 + 您的编辑。
【解决方案3】:

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

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

【讨论】:

  • 我不确定这是否是他要求的,但我给了你一个 +1 以防万一。不过,我有一种感觉,即 DetailsRecords 不包含任何元素。
【解决方案4】:

使用Any函数查看是否有记录:

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

【讨论】:

    【解决方案5】:

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

    int iNumber = iContext.DetailsRecords.OrderByDescending(x => x.Number).FirstOrDefault();
    

    我经常使用这种方式,如果结果为空,也可以让你设置一个新对象。

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

    【讨论】:

    • 这会在到达Max(...)方法时抛出异常。
    • 正在展示如何使用 FirstOrDefault 的示例... 修复了反映 OrderByDescending 的代码,以便在这种情况下工作。
    • 将 OrderByDescending 与 FirstOrDefault 结合使用是一个有趣的尝试……答案越多越好:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多