【问题标题】:What is the correct way to get a sortable string from a DateTime in a LINQ entity?从 LINQ 实体中的 DateTime 获取可排序字符串的正确方法是什么?
【发布时间】:2011-03-16 19:01:42
【问题描述】:
// 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;
}

我使用的 JavaScript 框架需要 ISO 8601 样式格式的日期,这正是在 DateTime 对象上调用 .ToString("s") 将返回的内容。

在 LINQ to SQL 中有更简洁/更有效的方法吗?

【问题讨论】:

  • 我的 0.02 美元:没有规定必须对同一事物进行显示和排序。这是你不应该的时候之一。返回一个日期时间。 JavaScriptSerializer 以专有格式处理这些。在 JS 中反序列化为 JS 日期。您的排序将起作用。
  • @Craig Stuntz:同意,虽然排序不是我真正的问题;这更多是 ExtJS 处理(尤其是解析)ISO 8601 的问题,比 .NET 的专有格式要干净得多。 .ToString("s") on Get 和 TryParse() on Save 会减少头痛(在我的特定情况下)。
  • 我们所做的(在 jQuery 中,但应该可移植到 Ext)是在返回的 JSON 上有一个反序列化过滤器,它查找 MS 格式并在反序列化期间将其替换为 Date
  • @Craig Stuntz:您可能会考虑在某处发布该反序列化过滤器;我想看看。
  • 这会给你大致的思路:telerik.com/community/forums/aspnet-mvc/grid/…

标签: c# linq linq-to-sql linq-to-entities


【解决方案1】:

我相信Wrapper 的技巧在这种情况下是可以做到的。对不起。

更新: 似乎这里再次提出了这个问题:Linq to Sql - DateTime Format - YYYY-MMM (2009-Mar)。那里的答案也很“抱歉”。考虑到谁参与了这个问题,我现在真的很确定你不能做得更好。

【讨论】:

    【解决方案2】:

    问题在于,当使用IQueryable 时,提供程序会尝试将所有 LINQ 表达式转换为可以发送到数据库的内容。它无法知道如何处理ToString("s"),因此抛出了NotSupported 异常。

    如果您要在 Select 调用之前添加 .AsEnumerable(),那么它应该可以工作。不同之处在于Person 对象将被完全带入内存,然后将运行投影(Select)方法,所有这些都是作为.NET 编译方法完成的,而不是SQL。所以基本上AsEnumerable()之后的任何事情都将在内存中而不是在数据库中完成,所以通常不建议在尽可能减少行数之前这样做(即毕竟WhereOrderBy s)。

    【讨论】:

      猜你喜欢
      • 2016-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-16
      • 2010-12-02
      • 2020-05-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多