Mar*_*ham 2 c# linq objectdatasource
我正在使用 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();
Run Code Online (Sandbox Code Playgroud)
如您所见,我在开始和结束日期中对开始和结束时间进行了编码,即使它们可能位于不同的日期。
当我执行此代码时,我得到:
“无法将表达式 'p.EndDate.ToShortTimeString()' 转换为 SQL,并且无法将其视为本地表达式。”
我知道我正在投影结果,但是,作为 Linq 的新手,我假设对 ToShortTimeString 的 C# 调用发生在投影之后。谁能帮我弄清楚如何获得我正在寻找的字符串?
原因是查询正在 LINQ to SQL 中使用。LINQ to SQL 将查询视为表达式树。它为某些方法(例如,Contains
)定义了映射,但由于它并没有真正执行它们,因此它不能对任意方法起作用。它解析查询并将其提交给 SQL 服务器。查询的等效项将作为 SQL 语句在数据库服务器上执行,结果将返回。问题是ToShortTimeString()
在 LINQ to SQL 中没有等效的 SQL 转换。这里使用的技巧是从 SQL 服务器获取数据并在客户端调用该方法(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();
Run Code Online (Sandbox Code Playgroud)