Permalink
Browse files

refs #25

SQL 生成機能から params 引数を取り除いた。
互換のために旧メソッドは Obsolete 扱い。
  • Loading branch information...
1 parent 4b4b933 commit c735e9e0b1a928c1180ba763a4365fea6ec29d32 Takaaki Suzuki committed Dec 26, 2015
View
@@ -1,7 +1,7 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 14
-VisualStudioVersion = 14.0.22310.1
+VisualStudioVersion = 14.0.24720.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DeclarativeSql", "Source\DeclarativeSql\DeclarativeSql.csproj", "{AA2BB595-C375-4BB2-BB31-514680B30AD3}"
EndProject
@@ -15,6 +15,10 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NuGet", "NuGet", "{1207B665
NuGet\DeclarativeSql.Dapper.nuspec = NuGet\DeclarativeSql.Dapper.nuspec
EndProjectSection
EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Test", "Test", "{0CBCB5FB-7350-4084-A4ED-D73DE862DCAD}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DeclarativeSql.Tests", "Test\DeclarativeSql.Tests.csproj", "{73D4DB30-4B5D-4301-8E1F-77C1D870B2FC}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -29,12 +33,17 @@ Global
{C4705693-AB4F-4D34-9EED-A1F4D6279800}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C4705693-AB4F-4D34-9EED-A1F4D6279800}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C4705693-AB4F-4D34-9EED-A1F4D6279800}.Release|Any CPU.Build.0 = Release|Any CPU
+ {73D4DB30-4B5D-4301-8E1F-77C1D870B2FC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {73D4DB30-4B5D-4301-8E1F-77C1D870B2FC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {73D4DB30-4B5D-4301-8E1F-77C1D870B2FC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {73D4DB30-4B5D-4301-8E1F-77C1D870B2FC}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{AA2BB595-C375-4BB2-BB31-514680B30AD3} = {DF1AFD52-D64C-4E20-9D10-EF79B466F96F}
{C4705693-AB4F-4D34-9EED-A1F4D6279800} = {DF1AFD52-D64C-4E20-9D10-EF79B466F96F}
+ {73D4DB30-4B5D-4301-8E1F-77C1D870B2FC} = {0CBCB5FB-7350-4084-A4ED-D73DE862DCAD}
EndGlobalSection
EndGlobal
@@ -195,5 +195,16 @@ public static IEnumerable<IndexedItem<T>> Indexed<T>(this IEnumerable<T> collect
public static IEnumerable<T> Except<T, TKey>(this IEnumerable<T> first, IEnumerable<T> second, Func<T, TKey> selector)
=> first.Except(second, new CompareSelector<T, TKey>(selector));
#endregion
+
+
+ #region IsEmpty
+ /// <summary>
+ /// 指定されたコレクションが空かどうかを確認します。
+ /// </summary>
+ /// <typeparam name="T">コレクション要素の型</typeparam>
+ /// <param name="collection">コレクション</param>
+ /// <returns>空の場合true</returns>
+ public static bool IsEmpty<T>(this IEnumerable<T> collection) => !collection.Any();
+ #endregion
}
}
@@ -43,6 +43,27 @@ public static IEnumerable<string> GetMemberNames<T>(IEnumerable<Expression<Func<
/// <summary>
+ /// 式木からメンバー名を取得します。
+ /// </summary>
+ /// <typeparam name="T">メンバーを持つ型</typeparam>
+ /// <param name="expression">式木</param>
+ /// <returns>メンバー名のコレクション</returns>
+ public static IEnumerable<string> GetMemberNames<T>(Expression<Func<T, object>> expression)
+ {
+ if (expression == null)
+ throw new ArgumentNullException(nameof(expression));
+
+ //--- 本体がコンストラクタ呼び出しの場合
+ var body = expression.Body as NewExpression;
+ if (body != null)
+ return body.Members.Select(x => x.Name);
+
+ //--- それ以外は通常処理
+ return new [] { This.GetMemberName(expression) };
+ }
+
+
+ /// <summary>
/// ラムダ式からMemberExpressionを取得します。
/// </summary>
/// <param name="expression">ラムダ式</param>
@@ -45,14 +45,11 @@ public static string CreateCount(Type type)
/// <typeparam name="T">テーブルの型</typeparam>
/// <param name="properties">抽出する列にマッピングされるプロパティのコレクション。指定がない場合はすべての列を抽出対象とします。</param>
/// <returns>生成されたSQL</returns>
- public static string CreateSelect<T>(params Expression<Func<T, object>>[] properties)
+ public static string CreateSelect<T>(Expression<Func<T, object>> properties = null)
{
- if (properties == null)
- throw new ArgumentNullException(nameof(properties));
-
- var propertyNames = properties.Length == 0
- ? new string[0]
- : ExpressionHelper.GetMemberNames(properties).ToArray();
+ var propertyNames = properties == null
+ ? null
+ : ExpressionHelper.GetMemberNames(properties);
return This.CreateSelect(typeof(T), propertyNames);
}
@@ -63,13 +60,13 @@ public static string CreateSelect<T>(params Expression<Func<T, object>>[] proper
/// <typeparam name="T">テーブルの型</typeparam>
/// <param name="propertyNames">抽出する列にマッピングされるプロパティのコレクション。指定がない場合はすべての列を抽出対象とします。</param>
/// <returns>生成されたSQL</returns>
- public static string CreateSelect(Type type, params string[] propertyNames)
+ public static string CreateSelect(Type type, IEnumerable<string> propertyNames = null)
{
if (type == null) throw new ArgumentNullException(nameof(type));
- if (propertyNames == null) throw new ArgumentNullException(nameof(propertyNames));
+ if (propertyNames == null) propertyNames = Enumerable.Empty<string>();
var table = TableMappingInfo.Create(type);
- var columns = propertyNames.Length == 0
+ var columns = propertyNames.IsEmpty()
? table.Columns
: table.Columns.Join
(
@@ -150,38 +147,15 @@ public static string CreateInsert(DbKind targetDatabase, Type type, bool useSequ
/// </summary>
/// <typeparam name="T">テーブルの型</typeparam>
/// <param name="targetDatabase">対象データベース</param>
- /// <param name="properties">プロパティ式のコレクション</param>
- /// <returns>生成されたSQL</returns>
- public static string CreateUpdate<T>(DbKind targetDatabase, params Expression<Func<T, object>>[] properties)
- => This.CreateUpdate<T>(targetDatabase, false, properties);
-
-
- /// <summary>
- /// 指定された型情報から、対象となるテーブルのレコードを指定されたプロパティにマッピングされている列に絞って更新するクエリを生成します。
- /// </summary>
- /// <param name="targetDatabase">対象データベース</param>
- /// <param name="type">テーブルの型</param>
- /// <param name="propertyNames">プロパティ名のコレクション</param>
- /// <returns>生成されたSQL</returns>
- public static string CreateUpdate(DbKind targetDatabase, Type type, params string[] propertyNames)
- => This.CreateUpdate(targetDatabase, type, false, propertyNames);
-
-
- /// <summary>
- /// 指定された型情報から、対象となるテーブルのレコードを指定されたプロパティにマッピングされている列に絞って更新するクエリを生成します。
- /// </summary>
- /// <typeparam name="T">テーブルの型</typeparam>
- /// <param name="targetDatabase">対象データベース</param>
+ /// <param name="properties">抽出する列にマッピングされるプロパティのコレクション。指定がない場合はすべての列を抽出対象とします。</param>
/// <param name="setIdentity">自動連番のID列に値を設定するかどうか</param>
- /// <param name="properties">プロパティ式のコレクション</param>
/// <returns>生成されたSQL</returns>
- public static string CreateUpdate<T>(DbKind targetDatabase, bool setIdentity, params Expression<Func<T, object>>[] properties)
+ public static string CreateUpdate<T>(DbKind targetDatabase, Expression<Func<T, object>> properties = null, bool setIdentity = false)
{
- if (properties == null)
- throw new ArgumentNullException(nameof(properties));
-
- var propertyNames = ExpressionHelper.GetMemberNames(properties).ToArray();
- return This.CreateUpdate(targetDatabase, typeof(T), setIdentity, propertyNames);
+ var propertyNames = properties == null
+ ? null
+ : ExpressionHelper.GetMemberNames(properties);
+ return This.CreateUpdate(targetDatabase, typeof(T), propertyNames, setIdentity);
}
@@ -190,18 +164,18 @@ public static string CreateUpdate<T>(DbKind targetDatabase, bool setIdentity, pa
/// </summary>
/// <param name="targetDatabase">対象データベース</param>
/// <param name="type">テーブルの型</param>
+ /// <param name="propertyNames">プロパティ名のコレクション。指定がない場合はすべての列を抽出対象とします。</param>
/// <param name="setIdentity">自動連番のID列に値を設定するかどうか</param>
- /// <param name="propertyNames">プロパティ名のコレクション</param>
/// <returns>生成されたSQL</returns>
- public static string CreateUpdate(DbKind targetDatabase, Type type, bool setIdentity, params string[] propertyNames)
+ public static string CreateUpdate(DbKind targetDatabase, Type type, IEnumerable<string> propertyNames = null, bool setIdentity = false)
{
if (type == null) throw new ArgumentNullException(nameof(type));
- if (propertyNames == null) throw new ArgumentNullException(nameof(propertyNames));
+ if (propertyNames == null) propertyNames = Enumerable.Empty<string>();
var prefix = targetDatabase.GetBindParameterPrefix();
var table = TableMappingInfo.Create(type);
var columns = table.Columns.Where(x => setIdentity ? true : !x.IsIdentity);
- if (propertyNames.Length != 0)
+ if (propertyNames.Any())
columns = columns.Join(propertyNames, x => x.PropertyName, y => y, (x, y) => x);
var setters = columns.Select(x => $" {x.ColumnName} = {prefix}{x.PropertyName}");
var builder = new StringBuilder();
@@ -261,5 +235,91 @@ public static string CreateTruncate(Type type)
return $"truncate table {table.FullName}";
}
#endregion
+
+
+ #region Obsolete
+#pragma warning disable 0618
+ /// <summary>
+ /// 指定された型情報から対象となるテーブルのレコードを取得するクエリを生成します。
+ /// </summary>
+ /// <typeparam name="T">テーブルの型</typeparam>
+ /// <param name="properties">抽出する列にマッピングされるプロパティのコレクション。指定がない場合はすべての列を抽出対象とします。</param>
+ /// <returns>生成されたSQL</returns>
+ [Obsolete("CreateSelect<T>(Expression<Func<T, object>> properties = null) を利用してください。")]
+ public static string CreateSelect<T>(params Expression<Func<T, object>>[] properties)
+ {
+ var propertyNames = properties == null || properties.Length == 0
+ ? null
+ : ExpressionHelper.GetMemberNames(properties);
+ return This.CreateSelect(typeof(T), propertyNames);
+ }
+
+
+ /// <summary>
+ /// 指定された型情報から対象となるテーブルのレコードを取得するクエリを生成します。
+ /// </summary>
+ /// <typeparam name="T">テーブルの型</typeparam>
+ /// <param name="propertyNames">抽出する列にマッピングされるプロパティのコレクション。指定がない場合はすべての列を抽出対象とします。</param>
+ /// <returns>生成されたSQL</returns>
+ [Obsolete("CreateSelect(Type type, IEnumerable<string> propertyNames = null) を利用してください。")]
+ public static string CreateSelect(Type type, params string[] propertyNames)
+ => This.CreateSelect(type, (IEnumerable<string>)propertyNames);
+
+
+ /// <summary>
+ /// 指定された型情報から、対象となるテーブルのレコードを指定されたプロパティにマッピングされている列に絞って更新するクエリを生成します。
+ /// </summary>
+ /// <typeparam name="T">テーブルの型</typeparam>
+ /// <param name="targetDatabase">対象データベース</param>
+ /// <param name="properties">プロパティ式のコレクション</param>
+ /// <returns>生成されたSQL</returns>
+ [Obsolete("CreateUpdate<T>(DbKind targetDatabase, Expression<Func<T, object>> properties = null, bool setIdentity = false) を利用してください。")]
+ public static string CreateUpdate<T>(DbKind targetDatabase, params Expression<Func<T, object>>[] properties)
+ => This.CreateUpdate<T>(targetDatabase, false, properties);
+
+
+ /// <summary>
+ /// 指定された型情報から、対象となるテーブルのレコードを指定されたプロパティにマッピングされている列に絞って更新するクエリを生成します。
+ /// </summary>
+ /// <param name="targetDatabase">対象データベース</param>
+ /// <param name="type">テーブルの型</param>
+ /// <param name="propertyNames">プロパティ名のコレクション</param>
+ /// <returns>生成されたSQL</returns>
+ [Obsolete("CreateUpdate(DbKind targetDatabase, Type type, IEnumerable<string> propertyNames = null, bool setIdentity = false) を利用してください。")]
+ public static string CreateUpdate(DbKind targetDatabase, Type type, params string[] propertyNames)
+ => This.CreateUpdate(targetDatabase, type, propertyNames, false);
+
+
+ /// <summary>
+ /// 指定された型情報から、対象となるテーブルのレコードを指定されたプロパティにマッピングされている列に絞って更新するクエリを生成します。
+ /// </summary>
+ /// <typeparam name="T">テーブルの型</typeparam>
+ /// <param name="targetDatabase">対象データベース</param>
+ /// <param name="setIdentity">自動連番のID列に値を設定するかどうか</param>
+ /// <param name="properties">プロパティ式のコレクション</param>
+ /// <returns>生成されたSQL</returns>
+ [Obsolete("CreateUpdate<T>(DbKind targetDatabase, Expression<Func<T, object>> properties = null, bool setIdentity = false) を利用してください。")]
+ public static string CreateUpdate<T>(DbKind targetDatabase, bool setIdentity, params Expression<Func<T, object>>[] properties)
+ {
+ var propertyNames = properties == null || properties.Length == 0
+ ? null
+ : ExpressionHelper.GetMemberNames(properties);
+ return This.CreateUpdate(targetDatabase, typeof(T), propertyNames, setIdentity);
+ }
+
+
+ /// <summary>
+ /// 指定された型情報から、対象となるテーブルのレコードを指定されたプロパティにマッピングされている列に絞って更新するクエリを生成します。
+ /// </summary>
+ /// <param name="targetDatabase">対象データベース</param>
+ /// <param name="type">テーブルの型</param>
+ /// <param name="setIdentity">自動連番のID列に値を設定するかどうか</param>
+ /// <param name="propertyNames">プロパティ名のコレクション</param>
+ /// <returns>生成されたSQL</returns>
+ [Obsolete("CreateUpdate(DbKind targetDatabase, Type type, IEnumerable<string> propertyNames = null, bool setIdentity = false) を利用してください。")]
+ public static string CreateUpdate(DbKind targetDatabase, Type type, bool setIdentity, params string[] propertyNames)
+ => This.CreateUpdate(targetDatabase, type, propertyNames, setIdentity);
+#pragma warning restore 0618
+ #endregion
}
}
Oops, something went wrong.

0 comments on commit c735e9e

Please sign in to comment.