我正在尝试采用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中完成其余的工作”。