Vb.net 如何在Linq查询中创建日期时间值?

Vb.net 如何在Linq查询中创建日期时间值?,vb.net,linq,entity-framework,Vb.net,Linq,Entity Framework,我正在尝试在Linq to实体中创建一个查询。我希望它返回包含从我查询的表中的字符串派生的DateTime属性的对象。数据(在SQL Server中)有一个名为date_occurrent的字符串日期字段(在数据库中显示为VARCHAR(8))。它有一个字符串时间字段(varchar(6)),称为time_occurrent 日期_的内容示例为“20131007”,表示2013年10月7日。发生时间_的内容示例为“145710”,表示下午2:57后10秒 我尝试了两种不起作用的方法: Dim A

我正在尝试在Linq to实体中创建一个查询。我希望它返回包含从我查询的表中的字符串派生的DateTime属性的对象。数据(在SQL Server中)有一个名为date_occurrent的字符串日期字段(在数据库中显示为VARCHAR(8))。它有一个字符串时间字段(varchar(6)),称为time_occurrent

日期_的内容示例为“20131007”,表示2013年10月7日。发生时间_的内容示例为“145710”,表示下午2:57后10秒

我尝试了两种不起作用的方法:

Dim ATQuery = From e In EntityContext.vwSecAppAuditToday
   Order By e.date_occurred, e.time_occurred
   Select New AuditEntry With {
      .EventTime = DateTime.ParseExact(Trim(e.date_occurred) & Trim(e.time_occurred), "yyyyMMddHHmmss", CultureInfo.InvariantCulture),
      .ServerName = e.server_name
}
这会抛出一个
NotSupportedException
,并显示一条消息:“LINQ to Entities无法识别方法'System.DateTime ParseExact(System.String,System.String,System.IFormatProvider)'方法,并且此方法无法转换为存储表达式。”

在此之前,我试过:

Dim ATQuery = From e In EntityContext.vwSecAppAuditToday
   Order By e.date_occurred, e.time_occurred
   Select New AuditEntry With {
      .EventTime = New DateTime(Integer.Parse(e.date_occurred.Substring(0, 4)),
         Integer.Parse(e.date_occurred.Substring(4, 2)),
         Integer.Parse(e.date_occurred.Substring(6, 2)),
         Integer.Parse(e.time_occurred.Substring(0, 2)),
         Integer.Parse(e.time_occurred.Substring(2, 2)),
         Integer.Parse(e.time_occurred.Substring(4, 2))),
      .ServerName = e.server_name
}
这还会引发一个
NotSupportedException
。在本例中,消息声明:“LINQtoEntities中只支持无参数构造函数和初始值设定项。”

我尝试使用Linq来实现的是实体吗

编辑:评论警报


对于后来阅读这篇文章的人,莫霍和马特·约翰逊发表了特别有用的评论。我已将它们标记为+1。

您的新日期时间只包含整数,因此看起来像20131008011300(适用于2013/10/08 01:13:00)


/
在日期之间,
在时间和日期与时间之间的
空间之间
丢失

选择包含感兴趣字段的匿名类(称为投影),然后在枚举IQueryable后为每个项创建DateTime结构:

Dim ATQuery = From e In EntityContext.vwSecAppAuditToday
   Order By e.date_occurred, e.time_occurred
   Select New With {
      .DateOccurred = e.date_occurred,
      .TimeOccurred = e.time_occurred,
      .ServerName = e.server_name
}

Dim q2 = From e In ATQuery.ToArray()
         Select New AuditEntry With {
             .EventTime = DateTime.ParseExact(Trim(e.DateOccurred) & Trim(e.TimeOccurred), "yyyyMMddHHmmss", CultureInfo.InvariantCulture),
             .ServerName = e.ServerName
}

您能给我们看看
e.date\u occurrented
e.time\u occurrented
的内容吗?非常好的建议。我会编辑这篇文章。谢谢您使用的是什么数据库,您使用的列是什么db类型?是否有某些原因导致您无法使用正确的SQL数据类型,例如
DATETIME
?这些数据类型应该可以工作。请确保在该视图中为已翻译的列添加索引。谢谢,但我仍然有点困惑:我认为我提供给ParseExact方法的格式字符串解释了它正在解析的简单数字字符串格式。此外,异常消息指出Linq“不识别该方法”。ParseExact不适用于不包含斜杠、冒号和空格的格式字符串吗?根据异常消息,Linq在可以出现在Linq查询中的代码中似乎非常有选择性。这不是Linq查询,这是Linq到实体的查询,我很高兴——谢谢!但是为什么呢?这是因为ParseExact调用现在位于数组数据的查询中,而不是实体框架中吗?是的-您必须记住,在使用EF DbContext时,IQueryable表达式将被转换为SQL语句。您遇到的错误是由于EF Linq to Entities查询提供程序不知道如何转换对SQL的
int.Parse
DateTime.ParseExact
调用,因为这些调用都是.NET构造。通过调用
.ToArray()
枚举原始数据库查询,您可以查询数据库并在本地(内存中)获得结果,然后您可以使用所有可供使用的.NET语言工具,正如您所看到的那样,fitI认为
一个可计算的
ToArray
更可取?