【问题标题】:LINQ counts null as 1 - how to avoid that?LINQ 将 null 计为 1 - 如何避免这种情况?
【发布时间】:2019-09-30 06:58:42
【问题描述】:

我正在尝试在 LINQ 中复制一个简单的 COUNT / GROUP BY。它可以在 SQL 中运行,但我的 LINQ 不能正常工作。我不想计算空值,但我的 LINQ 语句出于某种原因这样做。

这是我的 SQL:

  SELECT Count(ID),Year(DateCompleted)
    FROM dbo.Requests
    WHERE ISNULL(DateCompleted,'') <> ''
    group by year(datecompleted)

返回

7   2015
102 2016

这是我的 LINQ - null

var test = from r in Model.Requests
           where r.DateCompleted != null
           group r by r.DateCompleted.Year into grp
           select new ChartSimple() { K = grp.Key.ToString(), V =  grp.Count(x => x.DateCompleted != null) };

返回

7   2015
102 2016
10  1

我错过了什么?

【问题讨论】:

  • 可以发Request.DateCompleted的声明吗?它应该可以为空。
  • 如果将WHERE ISNULL(DateCompleted,'') &lt;&gt; '' 更改为WHERE DateCompleted IS NOT NULL,SQL 结果会怎样?
  • 在您的 sql 中,您还检查它是否不是空字符串 &lt;&gt; '' 您不要在 linq 表达式中这样做。
  • 等一下。 DateCompleted 是什么类型?您如何将其与 null 进行比较,同时还可以直接访问 Year?如果 DateTime 可以为空,那应该是不可能的。
  • DateCompleted != null 对于DateTime 类型将始终为真,这显然是DateCompleted 属性的类型。

标签: c# sql linq


【解决方案1】:

Request 实体上的DateCompleted 类型必须是 DateTime?Nullable&lt;DateTime&gt; 。这将告诉实体框架它应该期望该列可以为空,从而生成适当的 SQL。现在,您的代码似乎可以编译,但这是因为DateTime!= 运算符和null 被转换为DateTime 类型的过载,它无法有效地表示。

这将需要更改查询:

var test = from r in Model.Requests
       where r.DateCompleted != null
       group r by r.DateCompleted.Value.Year into grp
       select new ChartSimple() { K = grp.Key.ToString(), V =  grp.Count() };

而且count中的谓词是不必要的。

【讨论】:

  • 谢谢 - 我忘了在我的课堂上让 DateTime 可以为空:public DateTime? DateCompleted { get; set; }
【解决方案2】:

这可能是因为DateCompleted 不是DateTime? 类型,我想你只需要切换wheregroup 即可:

var test = from r in Model.Requests
           group r by r.DateCompleted.Year into grp
           where grp.Key > 1
           select new ChartSimple() { K = grp.Key.ToString(), V =  grp.Count() };

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 2015-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多