我正在使用ObjectDataSource访问业务类,并尝试产生对用户有意义的输出。返回值描述一个班级(如在课堂和教学中,而不是软件中)。我想以这样的范围显示上课时间:“ 9:00 AM-10:00 AM”。

这是我用来提取数据的Linq查询:

return classQuery.Select(p => new SelectClassData
                              {
                                   ClassID = p.ClassID,
                                   Title = p.Title,
                                   StartDate = p.StartDate.ToShortDateString(),
                                   EndDate = p.EndDate.ToShortDateString(),
                                   TimeOfClass =
                                   p.StartDate.ToShortTimeString() + " - " +
                                                       p.EndDate.ToShortTimeString()
                               }).ToList();


如您所见,我将开始时间和结束时间编码为开始日期和结束日期,即使这些日期可能位于不同的日期。

当我执行此代码时,我得到:

“无法将表达式'p.EndDate.ToShortTimeString()'转换为SQL,也无法将其视为本地表达式。”

我知道我正在投影结果,但是,对于Linq来说,这是我的新手,我假设对ToShortTimeString的C#调用发生在投影之后。谁能帮我弄清楚如何获取我要查找的字符串?

最佳答案

原因是查询在LINQ to SQL中使用。 LINQ to SQL将查询视为表达式树。它为某些方法(例如Contains)定义了映射,但是由于它实际上并未执行它们,因此无法在任意方法上使用。它解析查询并将其提交到SQL Server。该查询的等效项将作为SQL语句在数据库服务器上执行,结果将返回。问题是ToShortTimeString()在LINQ to SQL中没有等效的SQL转换。这里使用的技巧是从SQL Server提取数据并在客户端调用该方法(AsEnumerable将执行此操作)。

return classQuery.Select(p => new { p.ClassID, p.Title, p.StartDate, p.EndDate })
   .AsEnumerable()
   .Select(p => new SelectClassData {
       ClassID = p.ClassID,
       Title = p.Title,
       StartDate = p.StartDate.ToShortDateString(),
       EndDate = p.EndDate.ToShortDateString(),
       TimeOfClass = p.StartDate.ToShortTimeString() + " - " + p.EndDate.ToShortTimeString() })
   .ToList();

关于c# - 将Linq用于ObjectDataSource:如何使用ToShortTimeString转换日期时间?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/448890/

10-17 01:34