使用LINQ的ObjectDataSource控件:如何使用ToShortTimeString转换日期时间?
-
19-08-2019 - |
题
我访问使用一个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,我假设C#调用ToShortTimeString投影后发生的事情。谁能帮我找出如何让我要找的字符串?
解决方案
的原因是该查询中LINQ被用于SQL。 LINQ to SQL的查询对待作为表达式树。它有一些方法定义的映射(例如,Contains
),但因为它并没有真正执行它们,就不能在任意方法的工作。它解析查询,并将其提交到SQL Server。查询相当于将作为数据库服务器上的SQL语句来执行,结果会回来的。问题是ToShortTimeString()
不具有等效的SQL翻译中的LINQ to 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();
其他提示
我喜欢迈赫达德的答案了不少。它不仅解决了这个问题,它也教我一些关于LINQ的为好。谢谢!
我继续出拳的问题,不过,并没有拿出一个不同的方法,我将在这里描述的情况下,别人绊倒在这个问题上要考虑的问题。我的LINQ到SQL代码现在读取:
return classQuery.Select(p => new SelectClassData
{
ClassID = p.ClassID,
Title = p.Title,
sDate = p.StartDate,
eDate = p.EndDate
}).ToList();
请注意SDATE和EDATE现在日期时间对象而不是字符串。在“SelectClassData”对象,我简单改变了声明,使访问起始日期,结束日期和TimeOfClass变量经过一个属性getter:
public class SelectClassData
{
public int ClassID { get; set; }
public string Title { get; set; }
public DateTime sDate { get; set; }
public DateTime eDate { get; set; }
public string StartDate { get { return GetSDate(); } }
public string EndDate { get { return GetEDate(); } }
public string TimeOfClass { get { return GetTimeOfClass(); } }
protected string GetSDate()
{
return sDate.ToShortDateString();
}
protected string GetEDate()
{
return eDate.ToShortDateString();
}
protected string GetTimeOfClass()
{
return sDate.ToShortTimeString() + " - " + eDate.ToShortTimeString();
}
}
也就是说,我设置SDATE和EDATE经由LinqToSql但做了“ToShortTimeString”和“ToShortDateString”变换后 LINQ的检索通过在所述目标数据的类执行它。