C#拼接sql條件的類
#region public enum Comparison
public enum Comparison
{
/// <summary>
/// 等于號 =
/// </summary>
Equal,
/// <summary>
/// 不等于號 <>
/// </summary>
NotEqual,
/// <summary>
/// 大于號 >
/// </summary>
GreaterThan,
/// <summary>
/// 大于或等于 >=
/// </summary>
GreaterOrEqual,
/// <summary>
/// 小于 <
/// </summary>
LessThan,
/// <summary>
/// 小于或等于 <=
/// </summary>
LessOrEqual,
/// <summary>
/// 模糊查詢 Like
/// </summary>
Like,
/// <summary>
/// 模糊查詢 Not Like
/// </summary>
NotLike,
/// <summary>
/// is null
/// </summary>
IsNull,
/// <summary>
/// is not null
/// </summary>
IsNotNull,
/// <summary>
/// in
/// </summary>
In,
/// <summary>
/// not in
/// </summary>
NotIn,
/// <summary>
/// 左括號 (
/// </summary>
OpenParenthese,
/// <summary>
/// 右括號 )
/// </summary>
CloseParenthese,
Between,
StartsWith,
EndsWith
}
#endregion
public class ConditionHelper
{
#region 變量定義
string parameterPrefix = "@";
string parameterKey = "P";
/// <summary>
/// 用來拼接SQL語句
/// </summary>
StringBuilder conditionBuilder = new StringBuilder();
/// <summary>
/// 為True時表示字段為空或者Null時則不作為查詢條件
/// </summary>
bool isExcludeEmpty = true;
/// <summary>
/// 是否生成帶參數的sql
/// </summary>
bool isBuildParameterSql = true;
/// <summary>
/// 參數列表
/// </summary>
public List<SqlParameter> parameterList = new List<SqlParameter>();
int index = 0;
const string and = " AND ";
const string or = " OR ";
#endregion
#region 構造函數
/// <summary>
/// 創建ConditionHelper對象
/// </summary>
/// <param name="isBuildParameterSql">是否生成帶參數的sql</param>
/// <param name="isExcludeEmpty">為True時表示字段為空或者Null時則不作為查詢條件</param>
public ConditionHelper(bool isBuildParameterSql = true, bool isExcludeEmpty = true)
{
this.isBuildParameterSql = isBuildParameterSql;
this.isExcludeEmpty = isExcludeEmpty;
}
#endregion
#region 公共方法
/// <summary>
/// 添加and 條件
/// </summary>
/// <param name="fieldName">字段名稱</param>
/// <param name="comparison">比較符類型</param>
/// <param name="fieldValue">字段值</param>
/// <returns>返回ConditionHelper</returns>
public ConditionHelper AddAndCondition(string fieldName, Comparison comparison, params object[] fieldValue)
{
conditionBuilder.Append(and);
this.AddCondition(fieldName, comparison, fieldValue);
return this;
}
/// <summary>
/// 添加or條件
/// </summary>
/// <param name="fieldName">字段名稱</param>
/// <param name="comparison">比較符類型</param>
/// <param name="fieldValue">字段值</param>
/// <returns>返回ConditionHelper</returns>
public ConditionHelper AddOrCondition(string fieldName, Comparison comparison, params object[] fieldValue)
{
conditionBuilder.Append(or);
this.AddCondition(fieldName, comparison, fieldValue);
return this;
}
/// <summary>
/// 添加and+左括號+條件
/// </summary>
/// <param name="comparison">比較符類型</param>
/// <param name="fieldName">字段名稱</param>
/// <param name="fieldValue">字段值,注:Between時,此字段必須填兩個值</param>
/// <returns>返回ConditionHelper</returns>
public ConditionHelper AddAndOpenParenthese(string fieldName, Comparison comparison, params object[] fieldValue)
{
this.conditionBuilder.AppendFormat("{0}{1}", and, GetComparisonOperator(Comparison.OpenParenthese));
this.AddCondition(fieldName, comparison, fieldValue);
return this;
}
/// <summary>
/// 添加or+左括號+條件
/// </summary>
/// <returns></returns>
/// <param name="comparison">比較符類型</param>
/// <param name="fieldName">字段名稱</param>
/// <param name="fieldValue">字段值,注:Between時,此字段必須填兩個值</param>
/// <returns>返回ConditionHelper</returns>
public ConditionHelper AddOrOpenParenthese(string fieldName, Comparison comparison, params object[] fieldValue)
{
this.conditionBuilder.AppendFormat("{0}{1}", or, GetComparisonOperator(Comparison.OpenParenthese));
this.AddCondition(fieldName, comparison, fieldValue);
return this;
}
/// <summary>
/// 添加右括號
/// </summary>
/// <returns></returns>
public ConditionHelper AddCloseParenthese()
{
this.conditionBuilder.Append(GetComparisonOperator(Comparison.CloseParenthese));
return this;
}
/// <summary>
/// 添加條件
/// </summary>
/// <param name="comparison">比較符類型</param>
/// <param name="fieldName">字段名稱</param>
/// <param name="fieldValue">字段值,注:Between時,此字段必須填兩個值</param>
/// <returns>返回ConditionHelper</returns>
public ConditionHelper AddCondition(string fieldName, Comparison comparison, params object[] fieldValue)
{
//如果選擇IsExcludeEmpty為True,并且該字段為空值的話則跳過
if (isExcludeEmpty && string.IsNullOrEmpty(fieldValue.ToString()))
return this;
switch (comparison)
{
case Comparison.Equal:
case Comparison.NotEqual:
case Comparison.GreaterThan:
case Comparison.GreaterOrEqual:
case Comparison.LessThan:
case Comparison.LessOrEqual:
this.conditionBuilder.AppendFormat("{0}{1}{2}", GetFieldName(fieldName), GetComparisonOperator(comparison), GetFieldValue(fieldValue[0]));
break;
case Comparison.IsNull:
case Comparison.IsNotNull:
this.conditionBuilder.AppendFormat("{0}{1}", GetFieldName(fieldName), GetComparisonOperator(comparison));
break;
case Comparison.Like:
case Comparison.NotLike:
this.conditionBuilder.AppendFormat("{0}{1}{2}", GetFieldName(fieldName), GetComparisonOperator(comparison), GetFieldValue(string.Format("%{0}%", fieldValue[0])));
break;
case Comparison.In:
case Comparison.NotIn:
this.conditionBuilder.AppendFormat("{0}{1}({2})", GetFieldName(fieldName), GetComparisonOperator(comparison), string.Join(",", GetFieldValue(fieldValue)));
break;
case Comparison.StartsWith:
this.conditionBuilder.AppendFormat("{0}{1}{2}", GetFieldName(fieldName), GetComparisonOperator(comparison), GetFieldValue(string.Format("{0}%", fieldValue[0])));
break;
case Comparison.EndsWith:
this.conditionBuilder.AppendFormat("{0}{1}{2}", GetFieldName(fieldName), GetComparisonOperator(comparison), GetFieldValue(string.Format("%{0}", fieldValue[0])));
break;
case Comparison.Between:
this.conditionBuilder.AppendFormat("{0}{1}{2} AND {3}", GetFieldName(fieldName), GetComparisonOperator(comparison), GetFieldValue(fieldValue[0]), GetFieldValue(fieldValue[1]));
break;
default:
throw new Exception("條件為定義");
}
return this;
}
public override string ToString()
{
return this.conditionBuilder.ToString();
}
#endregion
#region 私有方法
/// <summary>
/// 取得字段值
/// </summary>
/// <param name="fieldValue"></param>
/// <returns></returns>
private string GetFieldValue(params object[] fieldValue)
{
if (isBuildParameterSql == false)
{
if (fieldValue.Length < 2)
{
return string.Format("'{0}'", fieldValue[0]);
}
else
{
return string.Format("'{0}'", string.Join("','", fieldValue));
}
}
else
{
if (fieldValue.Length < 2)
{
return AddParameter(fieldValue[0]);
}
else
{
List<string> parameterNameList = new List<string>();
foreach (var value in fieldValue)
{
parameterNameList.Add(AddParameter(value));
}
return string.Join(",", parameterNameList);
}
}
}
/// <summary>
/// 添加參數
/// </summary>
/// <param name="fieldValue"></param>
/// <returns></returns>
private string AddParameter(object fieldValue)
{
index++;
string parameterName = string.Format("{0}{1}{2}", parameterPrefix, parameterKey, index);
parameterList.Add(new SqlParameter()
{
ParameterName = parameterName,
Value = fieldValue
});
return parameterName;
}
private string GetFieldName(string fieldName)
{
return string.Format("[{0}]", fieldName);
}
private static string GetComparisonOperator(Comparison comparison)
{
string result = string.Empty;
switch (comparison)
{
case Comparison.Equal:
result = " = ";
break;
case Comparison.NotEqual:
result = " <> ";
break;
case Comparison.GreaterThan:
result = " > ";
break;
case Comparison.GreaterOrEqual:
result = " >= ";
break;
case Comparison.LessThan:
result = " < ";
break;
case Comparison.LessOrEqual:
result = " <= ";
break;
case Comparison.Like:
case Comparison.StartsWith:
case Comparison.EndsWith:
result = " LIKE ";
break;
case Comparison.NotLike:
result = " NOT LIKE ";
break;
case Comparison.IsNull:
result = " IS NULL ";
break;
case Comparison.IsNotNull:
result = " IS NOT NULL ";
break;
case Comparison.In:
result = " IN ";
break;
case Comparison.NotIn:
result = " NOT IN ";
break;
case Comparison.OpenParenthese:
result = " (";
break;
case Comparison.CloseParenthese:
result = ") ";
break;
case Comparison.Between:
result = " BETWEEN ";
break;
}
return result;
}
#endregion
}</pre>
比如說要實現這樣的一個例子:
UserName In ('張三','李四','王五') and Age between 1 and 17 and (Gender='Male' or Gender='Female')
實現代碼:
ConditionHelper helper = new ConditionHelper(false);
helper.AddCondition("UserName", Comparison.In, "張三", "李四", "王五")
.AddAndCondition("Age",Comparison.Between,1,17)
.AddAndOpenParenthese("Gender",Comparison.Equal,"Male")
.AddOrCondition("Gender",Comparison.Equal,"Female")
.AddCloseParenthese();
string condition=helper.ToString();
還有要提一下的是這個類中的isExcludeEmpty變量,這個是借鑒了園子里伍華聰的想法,由于是很早以前看的,具體是哪一篇文章就不太清楚了, 有興趣的可以去他博客http://www.cnblogs.com/wuhuacong/里找下看。這變量在這有什么用呢?不要小看這小小的變量,它讓 我們在實際中少了很多重復的代碼。比如界面上有一個條件文本框txtUserName,那我們一般拼接條件如下:
1 if(!string.IsNullOrEmpty(txtUserName.Text.Trim())
2 {
3 condition=string.Format("UserName like '%{0}%'",txtUserName.Text.Trim())
4 }
簡單說就是每次在拼接條件時都要判斷文本框里的值是否為空,只有在不為空的情況才加入條件里去。
現在在ConditonHelper里加了isExcludeEmpty變量,我們在使用的時候就不要加判斷了,在ConditionHelper中拼接條件時它會自動去判斷,是不是這樣讓代碼變得更簡潔?
本文由用戶 cg4f 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!