使用LINQ的ObjectDataSource控件:如何使用ToShortTimeString转换日期时间?

StackOverflow https://stackoverflow.com/questions/448890

  •  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的检索通过在所述目标数据的类执行它。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top