/// <summary> /// 指定された型情報から主キーによる更新クエリを生成します。 /// </summary> /// <typeparam name="T">テーブルの型</typeparam> /// <param name="properties">更新対象の列</param> /// <returns>生成されたSQL</returns> /// <remarks> /// [作成例] /// /// update TableName /// set /// Column3 = :Column3 /// Column4 = :Column4 /// where Column1 = :Column1 /// and Column2 = :Column2 /// </remarks> public static string CreateUpdateSql <T>(params Expression <Func <T, object> >[] properties) { var primaries = This.GetPrimaryKeyProperties <T>().Select(x => string.Format("{0} = :{0}", x)); var separator = string.Format("{0}and ", Environment.NewLine); var builder = new StringBuilder(); builder.AppendLine(This.CreateUpdateAllSql <T>(properties)); builder.Append("where "); builder.Append(string.Join(separator, primaries)); return(builder.ToString()); }
/// <summary> /// 指定された型情報から全件更新クエリを生成します。 /// </summary> /// <typeparam name="T">テーブルの型</typeparam> /// <param name="properties">更新対象の列</param> /// <returns>生成されたSQL</returns> /// <remarks> /// [作成例] /// /// update TableName /// set /// Column1 = :Column1 /// Column2 = :Column2 /// </remarks> public static string CreateUpdateAllSql <T>(params Expression <Func <T, object> >[] properties) { //--- パラメーター var table = This.GetTableAttribute <T>(); var columnNames = properties == null || properties.Length == 0 ? This.GetProperties <T>().Select(x => x.Name) : properties.GetMemberNames(); var setParams = columnNames.Select(x => string.Format("\t{0} = :{0}", x)); var separator = string.Format(",{0}", Environment.NewLine); //--- SQL生成 var builder = new StringBuilder(); builder.AppendFormat("update {0}.{1}", table.Schema, table.Name); builder.AppendLine(); builder.AppendLine("set"); builder.Append(string.Join(separator, setParams)); return(builder.ToString()); }
/// <summary> /// 指定された型情報から全レコードを取得するクエリを生成します。 /// </summary> /// <typeparam name="T">テーブルの型</typeparam> /// <param name="properties">取得対象の列</param> /// <returns>生成されたSQL</returns> /// <remarks> /// [作成例] /// /// select * from ACNSM.NSM_M_COMMON /// </remarks> public static string CreateSelectAllSql <T>(params Expression <Func <T, object> >[] properties) { var table = This.GetTableAttribute <T>(); if (properties == null || properties.Length == 0) { return(string.Format("select * from {0}.{1}", table.Schema, table.Name)); } else { var columnNames = properties.GetMemberNames(); var separator = string.Format(",{0}\t", Environment.NewLine); var builder = new StringBuilder(); builder.AppendLine("select"); builder.Append("\t"); builder.AppendLine(string.Join(separator, columnNames)); builder.AppendFormat("from {0}.{1}", table.Schema, table.Name); return(builder.ToString()); } }
/// <summary> /// 指定された型情報から主キーに付属しているシーケンスのインクリメントクエリを生成します。 /// </summary> /// <typeparam name="T">テーブルの型</typeparam> /// <returns>生成されたSQL</returns> /// <remarks> /// [作成例] /// /// select * sequence.nextval from dual /// </remarks> public static string CreateNextAutoIdSql <T>() { try { var keyType = typeof(KeyAttribute); var autoKey = This.GetProperties <T>() .Where(x => x.GetCustomAttributesData().Any(y => y.AttributeType == keyType)) //--- 主キーのみ .Select(x => new { ColumnName = x.Name, Sequence = x.GetCustomAttribute <SequenceAttribute>(false), }) .Single(x => x.Sequence != null); return(string.Format("select {0}.nextval from dual", autoKey.Sequence.FullName)); } catch { throw new ArgumentException("主キーが1つでシーケンスが利用されている型が指定されていません。"); } }
/// <summary> /// 指定された型情報から主キーによるレコード検索クエリを生成します。 /// </summary> /// <typeparam name="T">テーブルの型</typeparam> /// <param name="properties">取得対象の列</param> /// <returns>生成されたSQL</returns> /// <remarks> /// [作成例] /// /// select * from ACNSM.NSM_M_COMMON /// where MASTER_CD_KBN = :MASTER_CD_KBN /// and CD_KBN = :CD_KBN /// </remarks> public static string CreateSelectSql <T>(DB dB = DB.SQLServer, params Expression <Func <T, object> >[] properties) { IEnumerable <string> primaries = null; switch (dB) { case DB.SQLServer: primaries = This.GetPrimaryKeyProperties <T>().Select(x => string.Format("{0} = @{0}", x)); break; case DB.Oracle: primaries = This.GetPrimaryKeyProperties <T>().Select(x => string.Format("{0} = :{0}", x)); break; } //var primaries = This.GetPrimaryKeyProperties<T>().Select(x => string.Format("{0} = :{0}", x)); var separator = string.Format("{0}and ", Environment.NewLine); var builder = new StringBuilder(); builder.AppendLine(This.CreateSelectAllSql <T>(properties)); builder.Append(" where "); builder.Append(string.Join(separator, primaries)); return(builder.ToString()); }
/// <summary> /// 指定された型情報からレコードの挿入クエリを生成します。 /// </summary> /// <typeparam name="T">テーブルの型</typeparam> /// <returns>生成されたSQL</returns> public static string CreateInsertSql <T>(DB dB = DB.SQLServer) { //--- 列情報などのパラメーターを生成 var properties = This.GetProperties <T>(); var columnNames = properties.Select(x => string.Format("\t{0}", x.Name)); IEnumerable <string> values = null; switch (dB) { case DB.SQLServer: values = properties.Select(x => string.Format("\t@{0}", x.Name)); break; case DB.Oracle: values = properties.Select(x => string.Format("\t:{0}", x.Name)); break; } //var values = properties.Select(x => string.Format("\t:{0}", x.Name)); var table = This.GetTableAttribute <T>(); var separator = string.Format(",{0}", Environment.NewLine); //--- SQL組み立て var builder = new StringBuilder(); builder.AppendFormat("insert into {0}.{1}", table.Schema, table.Name); builder.AppendLine(); builder.AppendLine("("); builder.AppendLine(string.Join(separator, columnNames)); builder.AppendLine(")"); builder.AppendLine("values"); builder.AppendLine("("); builder.AppendLine(string.Join(separator, values)); builder.Append(")"); return(builder.ToString()); }
/// <summary> /// 指定された型情報からテーブルに含まれるレコードの件数を取得するクエリを生成します。 /// </summary> /// <typeparam name="T">テーブルの型</typeparam> /// <returns>生成されたSQL</returns> public static string CreateCountSql <T>() { var table = This.GetTableAttribute <T>(); return(string.Format("select count(*) as value from {0}.{1}", table.Schema, table.Name)); }
/// <summary> /// 指定された型情報から全レコードを削除するクエリを生成します。 /// </summary> /// <typeparam name="T">テーブルの型</typeparam> /// <returns>生成されたSQL</returns> /// <remarks> /// [作成例] /// /// delete from ACNSM.NSM_M_COMMON /// </remarks> public static string CreateDeleteAllSql <T>() { var table = This.GetTableAttribute <T>(); return(string.Format("delete from {0}.{1}", table.Schema, table.Name)); }