【问题标题】:Linq max giving inappropriate max value from tableLinq max 从表中给出不合适的最大值
【发布时间】:2017-08-31 12:44:58
【问题描述】:

我有一个像下面这样的类,我试图从中获取特定区域的最大值:

public partial class Ads
    {
       public int Id { get; set; }
       public int RegionId { get; set; }  
       public int Charge { get; set; } 
       public Nullable<int> Group { get; set; } 
    }

记录:

Id      RegionId    Charge   Group
1       100         100      1

现在我正在尝试获取 regionid=100 的最大值,但问题是我总是通过以下查询获得 1:

int group = context.Ads.Where(a => a.RegionId == 100).Max(t => (int?)t.Group)) ?? 0 + 1;

为什么上面只给我 1 而不是 2

【问题讨论】:

  • 为什么要给 2?
  • @Rahul OP 期望 Max 返回 1,然后将其加 1。
  • 顺便说一句 public Nullable&lt;int&gt; Group { get; set; } 应该是 public int? Group { get; set; }
  • 检查您的优先顺序
  • (context... ??0) + 1周围添加括号

标签: c# asp.net .net entity-framework linq


【解决方案1】:

您应该将?? 括在括号中:

int group = (context.Ads.Where(a => a.RegionId == 100).Max(t => (int?)t.Group) ?? 0) + 1;

原因是??的优先级很低,如果不使用括号,代码末尾的0 + 1会先计算,等于:

   int group = context.Ads.Where(a => a.RegionId == 100).Max(t => (int?)t.Group) ?? 1; 
                                                                 // as 0 + 1 equals to 1

【讨论】:

  • 可能值得添加解释,没有这个优先级与context.Ads.Where(a =&gt; a.RegionId == 100).Max(t =&gt; (int?)t.Group)) ?? (0 + 1)相同,与context.Ads.Where(a =&gt; a.RegionId == 100).Max(t =&gt; (int?)t.Group)) ?? 1相同
  • @JonHanna 我添加了一些解释
  • @Learning 那是因为我从你的代码中复制了那部分。请在您的代码中也修复它。
  • 赞成您为帮助我所做的努力,所以当我没有任何记录时,此查询将返回 1 正确而不是错误,这就是我们这样检查的原因:?? 0
  • 我也是。无论如何,非常感谢你的回答,请继续这样的帮助。感谢:)
【解决方案2】:

问题是它总是0,你需要在里面放()

int group = (context.Ads.Where(a => a.RegionId == 100).Max(t => (int?)t.Group)) ?? 0) + 1;

【讨论】:

  • 赞成您为帮助我所做的努力。感谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-15
  • 2015-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-12
相关资源
最近更新 更多