2011-02-08 12 views
0

デフォルトのCONVERTスタイルをオーバーライドすることはできますか?私は126LinqからSQLへのDatetime.ToString()のデフォルトの変換値をオーバーライド

は手順が再現するために、常にISO8601のスタイルを返すために、デフォルトCONVERT機能をしたいと思います:

DROP TABLE DATES; 

CREATE TABLE DATES 
(
    ID INT IDENTITY(1,1) PRIMARY KEY, 
    MYDATE DATETIME DEFAULT(GETUTCDATE()) 
); 

INSERT INTO DATES DEFAULT VALUES; 
INSERT INTO DATES DEFAULT VALUES; 
INSERT INTO DATES DEFAULT VALUES; 
INSERT INTO DATES DEFAULT VALUES; 

SELECT CONVERT(NVARCHAR,MYDATE) AS CONVERTED, 
     CONVERT(NVARCHAR(4000),MYDATE,126) AS ISO, 
     MYDATE FROM DATES 
WHERE MYDATE LIKE'Feb%' 

出力:

 
CONVERTED     ISO       MYDATE 
--------------------------- ---------------------------- ----------------------- 
Feb 8 2011 12:17AM   2011-02-08T00:17:03.040  2011-02-08 00:17:03.040 
Feb 8 2011 12:17AM   2011-02-08T00:17:03.040  2011-02-08 00:17:03.040 
Feb 8 2011 12:17AM   2011-02-08T00:17:03.040  2011-02-08 00:17:03.040 
Feb 8 2011 12:17AM   2011-02-08T00:17:03.040  2011-02-08 00:17:03.040 

LINQのツーSQLは、ときCONVERT(NVARCHAR,@p)を呼び出します私はToString()を投げた。しかし、すべてのデータをISO8601形式で表示しています。可能であれば、データベースのデフォルト値をCONVERT(NVARCHAR,@p,126)に上書きしたいと思います。

Dynamic Linq-to-SqlをデモしてScottGuでデータを処理しています。私は私の財産はCONVERT(NVARCHAR,@p)からCONVERT(NVARCHAR,@p,126)に式を変換します期待していた

PropertyInfo piField = typeof(T).GetProperty(rule.field); 
if (piField != null) 
{ 
    Type typeField = piField.PropertyType; 
    if (typeField.IsGenericType && typeField.GetGenericTypeDefinition().Equals(typeof(Nullable<>))) 
    { 
     filter = filter 
      .Select(x => x) 
      .Where(string.Format("{0} != null", rule.field)) 
      .Where(string.Format("{0}.Value.ToString().Contains(\"{1}\")", rule.field, rule.data)); 
    } 
    else 
    { 
     filter = filter 
      .Select(x => x) 
      .Where(string.Format("{0} != null", rule.field)) 
      .Where(string.Format("{0}.ToString().Contains(\"{1}\")", rule.field, rule.data)); 
    } 
} 

は、しかし、私は暗闇の中で、おそらくショットNotSupportedException: ... has no supported translation to SQL.

public string IsoDate 
{ 
    get 
    { 
     if (SUBMIT_DATE.HasValue) 
     { 
      return SUBMIT_DATE.Value.ToString("o"); 
     } 
     else 
     { 
      return string.Empty; 
     } 
    } 
} 

答えて

0

を参照してください。Ilya BuilukのASP.NET MVCで複数のフィルタを使用するjqGridの検索ツールバーを使用してcodeprojectにあるが見つかりました。クラスパラメータに基づいて動的に式を構築します。明らかに私は「含む」を使うことができませんでしたが、より多くの、あるいは少ない表現を使用することができました。

WhereOperationを文字列に置き換えることができます。この特定の例では、enumです。

私はより多くの表現を実装し、単語containsを使用するのではなく、検索を絞り込むことができました。

public static class LinqExtensions 
{ 
    public static IQueryable<T> Where<T>(this IQueryable<T> query, 
     string column, object value, WhereOperation operation) 
    { 
     if (string.IsNullOrEmpty(column)) 
      return query; 

     ParameterExpression parameter = Expression.Parameter(query.ElementType, "p"); 

     MemberExpression memberAccess = null; 
     foreach (var property in column.Split('.')) 
      memberAccess = MemberExpression.Property 
       (memberAccess ?? (parameter as Expression), property); 

     //change param value type 
     //necessary to getting bool from string 
     ConstantExpression filter = Expression.Constant 
      (
       Convert.ChangeType(value, memberAccess.Type) 
      ); 

     //switch operation 
     Expression condition = null; 
     LambdaExpression lambda = null; 
     switch (operation) 
     { 
      //equal == 
      case WhereOperation.Equal: 
       condition = Expression.Equal(memberAccess, filter); 
       lambda = Expression.Lambda(condition, parameter); 
       break; 
      //not equal != 
      case WhereOperation.NotEqual: 
       condition = Expression.NotEqual(memberAccess, filter); 
       lambda = Expression.Lambda(condition, parameter); 
       break; 
      //string.Contains() 
      case WhereOperation.Contains: 
       condition = Expression.Call(memberAccess, 
        typeof(string).GetMethod("Contains"), 
        Expression.Constant(value)); 
       lambda = Expression.Lambda(condition, parameter); 
       break; 
     } 


     MethodCallExpression result = Expression.Call(
       typeof(Queryable), "Where", 
       new[] { query.ElementType }, 
       query.Expression, 
       lambda); 

     return query.Provider.CreateQuery<T>(result); 
    } 
} 
0

そのを得るが、このリンク助けていますか?私は式ビルダーを使用する動的LINQを使用するのではなく

Given a DateTime object, how do I get an ISO 8601 date in string format?

+0

残念ながら。 linq-to-sql式を取得してISO 8601形式を生成するか、データベース側でCONVERTのデフォルトを設定する必要があります。 –

関連する問題