LINQ向EF抛出空例外

时间:2013-09-18 16:06:11

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

这行代码抛出异常:

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不支持查询中的转换吗?

3 个答案:

答案 0 :(得分:3)

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

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

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

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

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

答案 1 :(得分:0)

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

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类型,您可以要求插入具有正确数据类型的新列吗?

答案 2 :(得分:0)

  

我需要能够过滤

您似乎正在创建non-sargable query

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

dim myDate = DateTime.Now.ToString("yyyyMMdd");

Dim z = (From r In t Where 
  (r.appt_date = myDate)).ToArray
  

按日期排序

DB存储值的方式应如下所示:

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

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