我正在尝试采用DateTime值,如果该值不为null,则返回Short Time String。我的查询如下所示:
(TimeIn不可为空,而TimeOut为可为空)

    var times = from t in db.TimePostings
                where t.MemberID == member.MemberID
                select new
                {
                    Date = t.TimeIn.ToShortDateString(),
                    TimeIn = t.TimeIn.ToShortTimeString(),
                    TimeOut = t.TimeOut.HasValue ? t.TimeOut.Value.ToShortTimeString() : "-------"
                };
gvTimePostings.DataSource = times;
gvTimePostings.DataBind();

但这在我尝试与错误进行数据绑定(bind)时失败:



如果尝试使用,也会出现类似的错误:
TimeOut = t.TimeOut.HasValue ? Convert.ToDateTime(t.TimeOut).ToShortTimeString() : "-------"

但是,如果我将TimeOut属性更改为:
TimeOut = t.TimeOut.HasValue ? t.TimeOut.ToString() : "-------",

它工作正常,但不格式化我想要的时间(shortTimeString)。

那是怎么回事?

最佳答案

正如其他人所说,问题在于尝试将ToShortDateString等转换为SQL。幸运的是,这很容易解决:使用SQL提取数据,然后在.NET中对其进行格式化:

var timesFromDb = from t in db.TimePostings
                  where t.MemberID == member.MemberID
                  select new { t.TimeIn, t.TimeOut };

var times = from t in timesFromDb.AsEnumerable()
            select new
            {
                Date = t.TimeIn.ToShortDateString(),
                TimeIn = t.TimeIn.ToShortTimeString(),
                TimeOut = t.TimeOut.HasValue
                                     ? t.TimeOut.Value.ToShortTimeString()
                                     : "-------"
            };

这里对AsEnumerable()的调用基本上意味着:“停止尝试使用SQL处理查询;在LINQ to Objects中完成其余的工作”。

10-07 19:43
查看更多