C# 从LINQ实体中的日期时间获取可排序字符串的正确方法是什么? //员工服务: [网络方法] 公开名单 { 返回 ( 从p开始,以db.Persons为单位 其中p.Type=='E' 选择新员工 { Name=p.FullName, //HireDate=p.CreationDate.ToString(), //工作,但不是我需要的格式 //HireDate=p.CreationDate.ToString(“s”), //抛出NotSupportedException //HireDate=包装物(p.CreationDate), //工作,但让我担心性能 //内心感到死亡 } ).ToList(); } 私有字符串包装器(日期时间日期) { 返回日期。ToString(“s”); } //其他地方: 公营雇员 { 公共字符串名称; 公共字符串租用; }
我使用的JavaScript框架需要ISO 8601样式格式的日期,这正是调用C# 从LINQ实体中的日期时间获取可排序字符串的正确方法是什么? //员工服务: [网络方法] 公开名单 { 返回 ( 从p开始,以db.Persons为单位 其中p.Type=='E' 选择新员工 { Name=p.FullName, //HireDate=p.CreationDate.ToString(), //工作,但不是我需要的格式 //HireDate=p.CreationDate.ToString(“s”), //抛出NotSupportedException //HireDate=包装物(p.CreationDate), //工作,但让我担心性能 //内心感到死亡 } ).ToList(); } 私有字符串包装器(日期时间日期) { 返回日期。ToString(“s”); } //其他地方: 公营雇员 { 公共字符串名称; 公共字符串租用; },c#,linq,linq-to-sql,linq-to-entities,C#,Linq,Linq To Sql,Linq To Entities,我使用的JavaScript框架需要ISO 8601样式格式的日期,这正是调用DateTime对象上的.ToString(“s”)将返回的结果 在LINQ to SQL中是否有更干净/更有效的方法来实现这一点?我相信在这种情况下,包装器技巧是最好的。对不起 更新:这里似乎又有人问这个问题:。答案也差不多是“对不起”;考虑到是谁参与了这个问题,我现在真的确信你做得再好不过了。问题是,当使用IQueryable时,提供者试图将所有LINQ表达式翻译成它可以发送到数据库的内容。它无法知道如何处理ToS
DateTime
对象上的.ToString(“s”)
将返回的结果
在LINQ to SQL中是否有更干净/更有效的方法来实现这一点?我相信在这种情况下,
包装器
技巧是最好的。对不起
更新:这里似乎又有人问这个问题:。答案也差不多是“对不起”;考虑到是谁参与了这个问题,我现在真的确信你做得再好不过了。问题是,当使用
IQueryable
时,提供者试图将所有LINQ表达式翻译成它可以发送到数据库的内容。它无法知道如何处理ToString(“s”)
,因此会抛出NotSupported
异常
如果要在
选择调用之前添加.AsEnumerable()
,那么它应该可以工作。不同之处在于Person
对象将被完全带到内存中,然后运行投影(Select)方法,所有这些都将作为.NET编译方法而不是SQL来完成。因此,基本上AsEnumerable()
之后的任何操作都将在内存中执行,而不是在数据库中执行,因此通常不建议在尽可能减少行数之前执行(即,毕竟Where
和OrderBy
s).My$0.02:没有规则规定必须在同一个对象上显示和排序。这是你不应该做的事情之一。返回日期时间。JavaScriptSerializer以专有格式处理这些。在JS中反序列化为JS日期。你的分类会有用的。@Craig Stuntz:同意,尽管分类不是我真正的问题;这更多的是ExtJS处理(特别是解析)iso8601的问题,它比.NET的专有格式更清晰.ToString(“s”)
和Save上的TryParse()
减少了麻烦(在我的特殊情况下)在返回的JSON上有一个反序列化过滤器,它查找MS格式并在反序列化期间用<代码>日期>代码替换它。@ Craig Stuntz:您可以考虑在某处发布反序列化过滤器;我想看看。这会让你大致了解:
// EmployeeService:
[WebMethod]
public List<Employee> GetEmployees()
{
return
(
from p in db.Persons
where p.Type == 'E'
select new Employee
{
Name = p.FullName,
//HireDate = p.CreationDate.ToString(),
// works, but not in the format I need
//HireDate = p.CreationDate.ToString("s"),
// throws a NotSupportedException
//HireDate = Wrapper(p.CreationDate),
// works, but makes me worry about performance
// and feel dead inside
}
).ToList<Employee>();
}
private String Wrapper(DateTime date)
{
return date.ToString("s");
}
// Elsewhere:
public class Employee
{
public String Name;
public String HireDate;
}