【问题标题】:Null exception being thrown by LINQ to EFLINQ to EF 抛出空异常
【发布时间】:2013-09-19 04:37:17
【问题描述】:

这行代码抛出异常:

Dim z = (From r In t Where 
(DateTime.ParseExact(r.appt_date, "yyyyMMdd", CultureInfo.CurrentCulture).Date.Month _
= myDate.Date.Month) And _ 
(DateTime.ParseExact(r.appt_date, "yyyyMMdd", CultureInfo.CurrentCulture).Date.Day = _
 myDate.Date.Day) And _
(DateTime.ParseExact(r.appt_date, "yyyyMMdd", CultureInfo.CurrentCulture).Date.Year = _
myDate.Date.Year)).ToArray

T 定义如下:

Dim t = (From p In mydb.C_MYTABLE Select p).ToArray

由于有人要问我要做什么...我将约会日期作为字符串存储为数据库中的 yyyyMMdd,因此我无法更改数据库。我需要能够在应用程序级别按日期过滤和排序它们。我的理解是 LINQ 不支持查询内的转换?

【问题讨论】:

    标签: vb.net linq entity-framework-4


    【解决方案1】:

    (这个答案实际上并没有解释你的NullReferenceException - 但它提供了另一种方法。)

    鉴于您正在检查确切日期,在查询之前将myDate 格式化为yyyyMMdd 不是最简单的,然后:

    Dim z = (From r in t Where r.appt_date = formattedDate).ToArray
    

    ?这允许您按特定的 日期 进行过滤 - 如果您需要过滤到某个日期范围,我希望您可以使用 CompareTo。您的日期采用可排序格式,因此如果您需要查找(例如)2012 年 1 月 10 日和 2013 年 9 月 20 日之间的所有内容,您可以说该字符串必须“大于或等于”20120110 和“小于或等于“20130920。您还可以使用此属性进行排序 - 只需按文本表示排序即可。

    (也就是说,如果有数据库重新设计,请敦促负责人使用更合适的数据类型!)

    【讨论】:

      【解决方案2】:

      实体框架其自身将不支持这一点。但是,您可以从数据库中选择所有行,然后在应用程序级别对它们进行排序。像这样:

      r
          .ToList()
          .Select(o => new 
          { 
               data = o, 
               appt_date = DateTime.ParseExact(r.appt_date, "yyyyMMdd", CultureInfo.CurrentCulture)
          })
          .Where(o => o.appt_date < DateTime.Now)
          .OrderBy(o => o.appt_date);
      

      这有一个很大的缺点,就是从数据库中选择很多东西。

      或者,您可以将日期格式化为字符串,并使用它在数据库中进行过滤,然后解析日期:

      var formatedDate = DateTime.now.ToString("yyyyMMdd");
      
      r
         .Where(o => o.appt_date == formatedDate)
         .ToList()
         .Select(o => new 
              { 
                   data = o, 
                   appt_date = DateTime.ParseExact(r.appt_date, "yyyyMMdd", CultureInfo.CurrentCulture)
              })
              .OrderBy(o => o.appt_date);
      

      但理想情况下,我要求提高数据质量。如果您无法将“appt_date”更改为 Date 类型,是否可以要求插入具有正确数据类型的新列?

      【讨论】:

        【解决方案3】:

        我需要能够过滤

        您似乎正在创建non-sargable query

        我建议不要解析您正在查询的列,而是创建一个与您正在查找的值匹配的变量。

        dim myDate = DateTime.Now.ToString("yyyyMMdd");
        
        Dim z = (From r In t Where 
          (r.appt_date = myDate)).ToArray
        

        并按日期排序

        数据库存储值的方式应如下所示:

        20120101  // Jan 01, 2012
        20121231  // Dec 31, 2012
        20130101  // Jan 01, 2013
        20131231  // Dec 31, 2013
        

        自然字符串排序每次都会以正确的顺序(asc,desc)对它们进行排序,因此.OrderBy().OrderByDescending() 将按预期工作。

        【讨论】:

          猜你喜欢
          • 2011-07-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-30
          • 2015-04-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多