2011-03-16 15 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; 
} 

DateTimeオブジェクトで返されるものは、正確には.ToString("s")というオブジェクトが返されるISO 8601スタイル形式の日付を必要とするJavaScriptフレームワークを使用しています。LINQエンティティのDateTimeからソート可能な文字列を取得する正しい方法は何ですか?

LINQ to SQLでこれを行うには、よりクリーンで効率的な方法がありますか?

+0

My $ 0.02:同じことを表示して並べ替える必要があるというルールはありません。これは、あなたがしてはならない時代の一つです。 DateTimeを返します。 JavaScriptSerializerはこれらを独自の形式で処理します。 JSからJSの日付を逆シリアル化します。あなたの並べ替えは機能します。 –

+0

@Craig Stuntz:合意しましたが、ソートは実際には私の問題ではありません。それは、ExtJSの扱い方(特に、解析する)が、ISO 8601よりも.NETの専有フォーマットよりはるかにきれいです。 '' .ToString( "s") 'とGetParse()で保存すると頭痛が減ります(特に私の場合)。 –

+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オブジェクトが完全にメモリに持ち込まれると、投影(選択)メソッドが実行され、そのすべてがSQLではなく.NETコンパイルされたメソッドとして実行されることです。従って、AsEnumerable()の後の本質的なものは、データベース内ではなくメモリ内で行われるため、できるだけ多くの行をトリミングするまで(つまり、すべてWhereOrderByの後)、通常はお勧めできません。