0

这行代码抛出异常:

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

4

3 回答 3

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。您还可以使用此属性进行排序 - 只需按文本表示排序即可。

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

于 2013-09-18T16:13:59.110 回答
0

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

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

于 2013-09-18T16:17:40.657 回答
0

我需要能够过滤

您似乎正在创建一个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()预期工作。

于 2013-09-18T20:31:31.503 回答