2011-03-16 54 views
4
// 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實體中從DateTime獲取可排序字符串的正確方法是什麼?

在LINQ to SQL中有更清潔/更有效的方法嗎?

+0

我的$ 0.02:沒有規定說你必須在同一件事上展示和排序。這是你不應該這樣做的時候。返回一個DateTime。 JavaScriptSerializer以專有格式處理這些內容。將JS反序列化爲JS日期。你的排序將起作用。 –

+0

@Craig Stuntz:同意,儘管排序並不是我的問題;更關鍵的是ExtJS處理(特別是解析)ISO 8601比.NET專有格式乾淨得多。 '.ToString(「s」)'在Get上和'TryParse()'在Save上導致更少的麻煩(在我的情況下)。 –

+0

我們所做的(在jQuery中,但應該可移植到Ext)是在返回的JSON上有一個反序列化過濾器,該過濾器查找MS格式並在反序列化期間用Date替換它。 –

回答

2

我相信Wrapper技巧就像你在這種情況下所能獲得的那樣好。抱歉。

更新:似乎這再次問:Linq to Sql - DateTime Format - YYYY-MMM (2009-Mar)。答案也非常「抱歉」,考慮到誰參與了這個問題,我現在確定你不能做得更好。

0

問題是,當使用IQueryable時,提供程序會嘗試將所有LINQ表達式轉換爲可發送到數據庫的東西。它無法知道如何處理ToString("s"),因此引發了NotSupported異常。

如果您在Select調用之前添加.AsEnumerable(),那麼它應該工作。不同的是,Person對象將被完全引入內存,然後投影(Select)方法將會運行,所有這些都是作爲.NET編譯方法完成的,而不是SQL。因此,基本上任何在AsEnumerable()之後的內容都將在內存中完成,而不是在數據庫中完成,所以一般不建議在最大限度地減少行數之後(即在所有WhereOrderBy之後)。

相關問題