【问题标题】:C# Nullreferenceexception in DataTable.AsEnumerable() WhereDataTable.AsEnumerable() 中的 C# Nullreferenceexception 在哪里
【发布时间】:2018-07-27 07:28:32
【问题描述】:

据我所知,Where 子句至少有 1 个 Datarow。

我在调用 1) Select 2) DefaultIfEmpty 方法之前检查了 != null 当然,它通过了没有问题。

我也试过用?? false 但不知道它的确切工作机制以及如何使用它。

所有列都可以为空。

我不知道这里出了什么问题...整天寻找解决方案.. 因为我是自学程序员,基础知识真的很欠缺。

dt.AsEnumerable().Where(dr => (dr.Field<string>("name_first_API").Contains("Ibuprofen")
                            || dr.Field<string>("name_first_API").Contains("Dexibuprofen")
                            || dr.Field<string>("name_first_API").Contains("Naproxen")
                            || dr.Field<string>("name_first_API").Contains("Meloxicam"))
                            && dr.Field<DateTime>("rx_visitdate").Date >= DateTime.Today.AddYears(-3)).
                  Select(dr => dr.Field<int>("howlongday_rx")).
                  DefaultIfEmpty(0).Sum();

【问题讨论】:

  • DataTable 或其中一个字段为空
  • @TimSchmelter,我还审阅了您几个小时的答案,但无法理解。 DataTable 肯定不为空。那么如何避免字段为空呢?请多多指教。
  • 例如:...Where(dr=&gt;dr.Field&lt;string&gt;("name_first_API")?.Contains("Ibuprofen")==true || ...)
  • @TimSchmelter,好吧,让我试试这样......
  • @TimSchmelter,正如我在 OP 中所写的那样,所有这些都是可以为空的。它们都来自 SQL 表。

标签: c# datatable nullreferenceexception asenumerable


【解决方案1】:

如果 all 可以为 null,您可以使用:

string[] meds = { "Ibuprofen", "Dexibuprofen", "Naproxen", "Meloxicam" };
int sum = dt.AsEnumerable()
    .Select(dr => new
    {
        name = dr.Field<string>("name_first_API"),
        visit = dr.Field<DateTime?>("rx_visitdate"),
        howlong = dr.Field<int?>("howlongday_rx")
    })
    .Where(x => meds.Contains(x.name, StringComparer.InvariantCultureIgnoreCase)
                && x.visit?.Date >= DateTime.Today.AddYears(-3))
    .Sum(x => x.howlong ?? 0);

【讨论】:

  • 哦,老师……你在用光速写作吗? :) 我对高级代码感到不舒服......你一直是我的老师......谢谢你!
  • 你是幸福的提供者。幸福事业怎么样? :)
猜你喜欢
  • 2015-07-14
  • 2011-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-09
相关资源
最近更新 更多