这行代码抛出异常:
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不支持查询中的转换吗?
答案 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()
将按预期工作。