Update Core

This commit is contained in:
sunkaixuan 2017-07-14 03:17:00 +08:00
parent 6c3e3a68a0
commit 2a1e2cfd34
13 changed files with 196 additions and 68 deletions

View File

@ -390,8 +390,19 @@ namespace SqlSugar
public virtual int Count()
{
QueryBuilder.IsCount = true;
var sql = QueryBuilder.ToSqlString();
var sql = string.Empty;
if (QueryBuilder.PartitionByValue.IsValuable())
{
sql = QueryBuilder.ToSqlString();
sql = QueryBuilder.ToCountSql(sql);
}
else
{
QueryBuilder.IsCount = true;
sql = QueryBuilder.ToSqlString();
}
var reval = Context.Ado.GetInt(sql, QueryBuilder.Parameters.ToArray());
RestoreMapping();
QueryBuilder.IsCount = false;
@ -465,8 +476,16 @@ namespace SqlSugar
{
if (pageIndex == 0)
pageIndex = 1;
QueryBuilder.Skip = (pageIndex - 1) * pageSize;
QueryBuilder.Take = pageSize;
if (QueryBuilder.PartitionByValue.IsValuable())
{
QueryBuilder.ExternalPageIndex = pageIndex;
QueryBuilder.ExternalPageSize = pageSize;
}
else
{
QueryBuilder.Skip = (pageIndex - 1) * pageSize;
QueryBuilder.Take = pageSize;
}
return ToDataTable();
}
public virtual DataTable ToDataTablePage(int pageIndex, int pageSize, ref int totalNumber)
@ -483,8 +502,16 @@ namespace SqlSugar
{
if (pageIndex == 0)
pageIndex = 1;
QueryBuilder.Skip = (pageIndex - 1) * pageSize;
QueryBuilder.Take = pageSize;
if (QueryBuilder.PartitionByValue.IsValuable())
{
QueryBuilder.ExternalPageIndex = pageIndex;
QueryBuilder.ExternalPageSize = pageSize;
}
else
{
QueryBuilder.Skip = (pageIndex - 1) * pageSize;
QueryBuilder.Take = pageSize;
}
return ToList();
}
public virtual List<T> ToPageList(int pageIndex, int pageSize, ref int totalNumber)

View File

@ -34,6 +34,8 @@ namespace SqlSugar
#region Splicing basic
public bool IsCount { get; set; }
public int? Skip { get; set; }
public int ExternalPageIndex { get; set; }
public int ExternalPageSize { get; set; }
public int? Take { get; set; }
public string OrderByValue { get; set; }
public object SelectValue { get; set; }
@ -127,6 +129,13 @@ namespace SqlSugar
return @"SELECT * FROM ({0}) T WHERE RowIndex BETWEEN {1} AND {2}";
}
}
public virtual string ExternalPageTempalte
{
get
{
return @"SELECT * FROM ({0}) T WHERE RowIndex2 BETWEEN {1} AND {2}";
}
}
public virtual string DefaultOrderByTemplate
{
get
@ -214,6 +223,7 @@ namespace SqlSugar
}
public virtual string ToSqlString()
{
string oldOrderBy=this.OrderByValue;
if (!IsDisabledGobalFilter && this.Context.QueryFilter.GeFilterList.IsValuable())
{
var gobalFilterList = this.Context.QueryFilter.GeFilterList.Where(it => it.FilterName.IsNullOrEmpty()).ToList();
@ -236,27 +246,44 @@ namespace SqlSugar
}
var isRowNumber = Skip != null || Take != null;
var rowNumberString = string.Format(",ROW_NUMBER() OVER({0}) AS RowIndex ", GetOrderByString);
sql.AppendFormat(SqlTemplate, GetSelectValue, GetTableNameString, GetWhereValueString, GetGroupByString + HavingInfos,(!isRowNumber&&this.OrderByValue.IsValuable())?GetOrderByString:null);
sql.Replace("{$:OrderByString:$}", isRowNumber? (this.IsCount?null: rowNumberString): null);
sql.AppendFormat(SqlTemplate, GetSelectValue, GetTableNameString, GetWhereValueString, GetGroupByString + HavingInfos, (!isRowNumber && this.OrderByValue.IsValuable()) ? GetOrderByString : null);
sql.Replace("{$:OrderByString:$}", isRowNumber ? (this.IsCount ? null : rowNumberString) : null);
if (IsCount) { return sql.ToString(); }
if (Skip != null && Take == null)
{
return string.Format(PageTempalte, sql.ToString(), Skip.ObjToInt() + 1, long.MaxValue);
var result= ToPageSql(sql.ToString(),this.Take,this.Skip);
if (ExternalPageIndex > 0) {
result = string.Format("SELECT *,ROW_NUMBER() OVER(ORDER BY GETDATE()) AS RowIndex2 FROM ({0}) ExternalTable ", result);
result = ToPageSql(result, (ExternalPageIndex-1)*ExternalPageSize,ExternalPageSize,true);
}
else if (Skip == null && Take != null)
this.OrderByValue = oldOrderBy;
return result;
}
public virtual string ToCountSql(string sql) {
return string.Format(" SELECT COUNT(1) FROM ({0}) CountTable ",sql);
}
public virtual string ToPageSql(string sql,int? take,int? skip,bool isExternal=false)
{
string temp = isExternal?ExternalPageTempalte:PageTempalte;
if (skip != null && take == null)
{
return string.Format(PageTempalte, sql.ToString(), 1, Take.ObjToInt());
return string.Format(temp, sql.ToString(), skip.ObjToInt() + 1, long.MaxValue);
}
else if (Skip != null && Take != null)
else if (skip == null && take != null)
{
return string.Format(PageTempalte, sql.ToString(), Skip.ObjToInt() + 1, Skip.ObjToInt() + Take.ObjToInt());
return string.Format(temp, sql.ToString(), 1, take.ObjToInt());
}
else if (skip != null && take != null)
{
return string.Format(temp, sql.ToString(), skip.ObjToInt() + 1, skip.ObjToInt() + take.ObjToInt());
}
else
{
return sql.ToString();
}
}
public virtual string ToJoinString(JoinQueryInfo joinInfo)
{
return string.Format(

View File

@ -48,9 +48,17 @@ namespace SqlSugar
}
public static bool IsLogicOperator(string operatorValue)
{
return operatorValue=="&&"|| operatorValue=="||";
return operatorValue == "&&" || operatorValue == "||";
}
public static bool IsComparisonOperator(BinaryExpression expression)
public static bool IsLogicOperator(Expression expression)
{
return expression.NodeType == ExpressionType.And ||
expression.NodeType == ExpressionType.AndAlso ||
expression.NodeType == ExpressionType.Or ||
expression.NodeType == ExpressionType.OrElse;
}
public static bool IsComparisonOperator(Expression expression)
{
return expression.NodeType != ExpressionType.And &&
expression.NodeType != ExpressionType.AndAlso &&
@ -120,7 +128,7 @@ namespace SqlSugar
{
object reval = null;
FieldInfo field = (FieldInfo)memberExpr.Member;
Check.Exception(field.IsPrivate,string.Format(" Field \"{0}\" can't be private ",field.Name));
Check.Exception(field.IsPrivate, string.Format(" Field \"{0}\" can't be private ", field.Name));
reval = field.GetValue(memberExpr.Member);
if (reval != null && reval.GetType().IsClass() && reval.GetType() != ExpressionConst.StringType)
{
@ -143,6 +151,23 @@ namespace SqlSugar
return reval;
}
public static bool IsConstExpression(MemberExpression memberExpr)
{
var result = false;
while (memberExpr!=null&&memberExpr.Expression != null)
{
var isConst = memberExpr.Expression is ConstantExpression;
if (isConst)
{
result = true;
break;
}
memberExpr = memberExpr.Expression as MemberExpression;
}
return result;
}
public static object GetPropertyValue(MemberExpression memberExpr)
{
object reval = null;
@ -191,7 +216,7 @@ namespace SqlSugar
public static bool IsEntity(Type type)
{
return type.IsClass() && type!=ExpressionConst.StringType;
return type.IsClass() && type != ExpressionConst.StringType;
}
public static bool IsValueType(Type type)

View File

@ -14,8 +14,20 @@ namespace SqlSugar
var isLeft = parameter.IsLeft;
var isSetTempData = baseParameter.CommonTempData.IsValuable() && baseParameter.CommonTempData.Equals(CommonTempDataType.Result);
var expression = base.Expression as MemberExpression;
if (expression.Expression != null&& expression.Expression.NodeType!= ExpressionType.Parameter) {
var value= ExpressionTool.GetMemberValue(expression.Member, expression);
var isValue = expression.Member.Name == "Value" && expression.Member.GetType().Name == "RuntimePropertyInfo";
var isBool = expression.Type == PubConst.BoolType;
var isValueBool = isValue && isBool && parameter.BaseExpression == null;
if (isValueBool)
{
isValue = false;
}
else if (isValue)
{
expression = expression.Expression as MemberExpression;
}
else if (expression.Expression != null && expression.Expression.NodeType != ExpressionType.Parameter && !isValueBool)
{
var value = ExpressionTool.GetMemberValue(expression.Member, expression);
if (isSetTempData)
{
baseParameter.CommonTempData = value;
@ -31,7 +43,7 @@ namespace SqlSugar
switch (parameter.Context.ResolveType)
{
case ResolveExpressType.SelectSingle:
fieldName = getSingleName(parameter, expression, isLeft);
fieldName = GetSingleName(parameter, expression, isLeft);
if (isSetTempData)
{
baseParameter.CommonTempData = fieldName;
@ -42,7 +54,7 @@ namespace SqlSugar
}
break;
case ResolveExpressType.SelectMultiple:
fieldName = getMultipleName(parameter, expression, isLeft);
fieldName = GetMultipleName(parameter, expression, isLeft);
if (isSetTempData)
{
baseParameter.CommonTempData = fieldName;
@ -53,42 +65,46 @@ namespace SqlSugar
}
break;
case ResolveExpressType.WhereSingle:
if (isSetTempData)
{
fieldName = getSingleName(parameter, expression, null);
baseParameter.CommonTempData = fieldName;
}
else
{
fieldName = getSingleName(parameter, expression, isLeft);
if (expression.Type == PubConst.BoolType&&baseParameter.OperatorValue.IsNullOrEmpty()) {
fieldName= "( "+fieldName+"=1 )";
}
fieldName = AppendMember(parameter, isLeft, fieldName);
}
break;
case ResolveExpressType.WhereMultiple:
var isSingle = parameter.Context.ResolveType == ResolveExpressType.WhereSingle;
if (isSetTempData)
{
fieldName = getMultipleName(parameter, expression, null);
fieldName = GetName(parameter, expression, null,isSingle);
baseParameter.CommonTempData = fieldName;
}
else
{
fieldName = getMultipleName(parameter, expression, isLeft);
if (isValueBool)
{
fieldName = GetName(parameter, expression.Expression as MemberExpression, isLeft,isSingle);
}
else if (ExpressionTool.IsConstExpression(expression))
{
var value = ExpressionTool.GetMemberValue(expression.Member, expression);
base.AppendValue(parameter, isLeft, value);
return;
}
else
{
fieldName = GetName(parameter, expression, isLeft,isSingle);
}
if (expression.Type == PubConst.BoolType && baseParameter.OperatorValue.IsNullOrEmpty())
{
fieldName = "( " + fieldName + "=1 )";
}
fieldName = AppendMember(parameter, isLeft, fieldName);
}
break;
case ResolveExpressType.FieldSingle:
fieldName = getSingleName(parameter, expression, isLeft);
fieldName = GetSingleName(parameter, expression, isLeft);
base.Context.Result.Append(fieldName);
break;
case ResolveExpressType.FieldMultiple:
fieldName = getMultipleName(parameter, expression, isLeft);
fieldName = GetMultipleName(parameter, expression, isLeft);
base.Context.Result.Append(fieldName);
break;
case ResolveExpressType.ArraySingle:
fieldName = getArrayName(parameter, expression, isLeft);
fieldName = GetArrayName(parameter, expression, isLeft);
base.Context.Result.Append(fieldName);
break;
default:
@ -98,7 +114,7 @@ namespace SqlSugar
private string AppendMember(ExpressionParameter parameter, bool? isLeft, string fieldName)
{
if (parameter.BaseExpression is BinaryExpression|| (parameter.BaseParameter.CommonTempData!=null&&parameter.BaseParameter.CommonTempData.Equals(CommonTempDataType.Append)))
if (parameter.BaseExpression is BinaryExpression || (parameter.BaseParameter.CommonTempData != null && parameter.BaseParameter.CommonTempData.Equals(CommonTempDataType.Append)))
{
fieldName = string.Format(" {0} ", fieldName);
if (isLeft == true)
@ -122,23 +138,35 @@ namespace SqlSugar
return fieldName;
}
private string getMultipleName(ExpressionParameter parameter, MemberExpression expression, bool? isLeft)
private string GetName(ExpressionParameter parameter, MemberExpression expression, bool? isLeft, bool isSingle)
{
if (isSingle)
{
return GetSingleName(parameter, expression, IsLeft);
}
else
{
return GetMultipleName(parameter,expression,IsLeft);
}
}
private string GetMultipleName(ExpressionParameter parameter, MemberExpression expression, bool? isLeft)
{
string shortName = expression.Expression.ToString();
string fieldName = expression.Member.Name;
fieldName=this.Context.GetDbColumnName(expression.Expression.Type.Name, fieldName);
fieldName =Context.GetTranslationColumnName(shortName + "." + fieldName);
fieldName = this.Context.GetDbColumnName(expression.Expression.Type.Name, fieldName);
fieldName = Context.GetTranslationColumnName(shortName + "." + fieldName);
return fieldName;
}
private string getSingleName(ExpressionParameter parameter, MemberExpression expression, bool? isLeft)
private string GetSingleName(ExpressionParameter parameter, MemberExpression expression, bool? isLeft)
{
string fieldName = expression.Member.Name;
fieldName = this.Context.GetDbColumnName(expression.Expression.Type.Name, fieldName);
fieldName = Context.GetTranslationColumnName(fieldName);
return fieldName;
}
private string getArrayName(ExpressionParameter parameter, MemberExpression expression, bool? isLeft)
private string GetArrayName(ExpressionParameter parameter, MemberExpression expression, bool? isLeft)
{
string fieldName = expression.Member.Name;
return fieldName;

View File

@ -17,5 +17,5 @@ using System.Runtime.InteropServices;
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("1c022a5c-4e4d-4026-a8a3-f659b9740a1a")]
[assembly: AssemblyVersion("4.2.0.4")]
[assembly: AssemblyFileVersion("4.2.0.4")]
[assembly: AssemblyVersion("4.2.0.5")]
[assembly: AssemblyFileVersion("4.2.0.5")]

View File

@ -38,6 +38,9 @@ namespace SqlSugar
new KeyValuePair<string, CSharpDataType>("text",CSharpDataType.@string),
new KeyValuePair<string, CSharpDataType>("char",CSharpDataType.@string),
new KeyValuePair<string, CSharpDataType>("enum",CSharpDataType.@string),
new KeyValuePair<string, CSharpDataType>("mediumtext",CSharpDataType.@string),
new KeyValuePair<string, CSharpDataType>("tinytext",CSharpDataType.@string),
new KeyValuePair<string, CSharpDataType>("longtext",CSharpDataType.@string),
new KeyValuePair<string, CSharpDataType>("tinyint",CSharpDataType.@byte),
new KeyValuePair<string, CSharpDataType>("smallint",CSharpDataType.@short),

View File

@ -1,21 +1,27 @@
namespace SqlSugar
{
public class MySqlQueryable<T>:QueryableProvider<T>
public class MySqlQueryable<T> : QueryableProvider<T>
{
public override ISugarQueryable<T> With(string withString)
{
return this;
}
public override ISugarQueryable<T> PartitionBy(string groupFileds)
{
this.GroupBy(groupFileds);
return this;
}
}
public class MySqlQueryable<T,T2> : QueryableProvider<T,T2>
public class MySqlQueryable<T, T2> : QueryableProvider<T, T2>
{
}
public class MySqlQueryable<T, T2,T3> : QueryableProvider<T, T2,T3>
public class MySqlQueryable<T, T2, T3> : QueryableProvider<T, T2, T3>
{
}
public class MySqlQueryable<T, T2,T3,T4> : QueryableProvider<T, T2,T3,T4>
public class MySqlQueryable<T, T2, T3, T4> : QueryableProvider<T, T2, T3, T4>
{
}

View File

@ -35,31 +35,34 @@ namespace SqlSugar
}
public override string ToSqlString()
{
string oldOrderValue = this.OrderByValue;
string result = null;
sql = new StringBuilder();
sql.AppendFormat(SqlTemplate, GetSelectValue, GetTableNameString, GetWhereValueString, GetGroupByString + HavingInfos, (Skip != null || Take != null) ? null : GetOrderByString);
if (IsCount) { return sql.ToString(); }
if (Skip != null && Take == null)
{
if (this.OrderByValue == "ORDER BY ") this.OrderByValue += GetSelectValue.Split(',')[0];
return string.Format(PageTempalte, GetSelectValue, GetTableNameString, GetWhereValueString, GetGroupByString + HavingInfos, (Skip != null || Take != null) ? null : GetOrderByString, Skip.ObjToInt(), long.MaxValue);
result = string.Format(PageTempalte, GetSelectValue, GetTableNameString, GetWhereValueString, GetGroupByString + HavingInfos, (Skip != null || Take != null) ? null : GetOrderByString, Skip.ObjToInt(), long.MaxValue);
}
else if (Skip == null && Take != null)
{
if (this.OrderByValue == "ORDER BY ") this.OrderByValue += GetSelectValue.Split(',')[0];
return string.Format(PageTempalte, GetSelectValue, GetTableNameString, GetWhereValueString, GetGroupByString + HavingInfos, GetOrderByString, 1, Take.ObjToInt());
result = string.Format(PageTempalte, GetSelectValue, GetTableNameString, GetWhereValueString, GetGroupByString + HavingInfos, GetOrderByString, 1, Take.ObjToInt());
}
else if (Skip != null && Take != null)
{
if (this.OrderByValue == "ORDER BY ") this.OrderByValue += GetSelectValue.Split(',')[0];
return string.Format(PageTempalte, GetSelectValue, GetTableNameString, GetWhereValueString, GetGroupByString + HavingInfos, GetOrderByString, Skip.ObjToInt() > 0 ? Skip.ObjToInt(): 0, Take);
result = string.Format(PageTempalte, GetSelectValue, GetTableNameString, GetWhereValueString, GetGroupByString + HavingInfos, GetOrderByString, Skip.ObjToInt() > 0 ? Skip.ObjToInt() : 0, Take);
}
else
{
return sql.ToString();
result = sql.ToString();
}
this.OrderByValue = oldOrderValue;
return result;
}
#endregion
#region Get SQL Partial

View File

@ -15,7 +15,7 @@ namespace SqlSugar
List<DbColumnInfo> columns = new List<DbColumnInfo>();
if (entityInfo.Columns.IsValuable())
{
foreach (var item in entityInfo.Columns)
foreach (var item in entityInfo.Columns.Where(it => it.IsIgnore == false))
{
DbColumnInfo dbColumnInfo = this.EntityColumnToDbColumn(entityInfo, tableName, item);
columns.Add(dbColumnInfo);

View File

@ -6,6 +6,12 @@
{
return this;
}
public override ISugarQueryable<T> PartitionBy(string groupFileds)
{
this.GroupBy(groupFileds);
return this;
}
}
public class SqliteQueryable<T,T2> : QueryableProvider<T,T2>
{

View File

@ -35,29 +35,32 @@ namespace SqlSugar
}
public override string ToSqlString()
{
string result = null;
string oldOrderBy = this.OrderByValue;
sql = new StringBuilder();
sql.AppendFormat(SqlTemplate, GetSelectValue, GetTableNameString, GetWhereValueString, GetGroupByString + HavingInfos, (Skip != null || Take != null) ? null : GetOrderByString);
if (IsCount) { return sql.ToString(); }
if (Skip != null && Take == null)
{
if (this.OrderByValue == "ORDER BY ") this.OrderByValue += GetSelectValue.Split(',')[0];
return string.Format(PageTempalte, GetSelectValue, GetTableNameString, GetWhereValueString, GetGroupByString + HavingInfos, (Skip != null || Take != null) ? null : GetOrderByString, Skip.ObjToInt(), long.MaxValue);
result= string.Format(PageTempalte, GetSelectValue, GetTableNameString, GetWhereValueString, GetGroupByString + HavingInfos, (Skip != null || Take != null) ? null : GetOrderByString, Skip.ObjToInt(), long.MaxValue);
}
else if (Skip == null && Take != null)
{
if (this.OrderByValue == "ORDER BY ") this.OrderByValue += GetSelectValue.Split(',')[0];
return string.Format(PageTempalte, GetSelectValue, GetTableNameString, GetWhereValueString, GetGroupByString + HavingInfos, GetOrderByString, 1, Take.ObjToInt());
result= string.Format(PageTempalte, GetSelectValue, GetTableNameString, GetWhereValueString, GetGroupByString + HavingInfos, GetOrderByString, 1, Take.ObjToInt());
}
else if (Skip != null && Take != null)
{
if (this.OrderByValue == "ORDER BY ") this.OrderByValue += GetSelectValue.Split(',')[0];
return string.Format(PageTempalte, GetSelectValue, GetTableNameString, GetWhereValueString, GetGroupByString + HavingInfos, GetOrderByString, Skip.ObjToInt() > 0 ? Skip.ObjToInt(): 0, Take);
result= string.Format(PageTempalte, GetSelectValue, GetTableNameString, GetWhereValueString, GetGroupByString + HavingInfos, GetOrderByString, Skip.ObjToInt() > 0 ? Skip.ObjToInt(): 0, Take);
}
else
{
return sql.ToString();
result= sql.ToString();
}
this.OrderByValue = oldOrderBy;
return result;
}
#endregion

View File

@ -2,7 +2,7 @@
<package >
<metadata>
<id>sqlSugarCore</id>
<version>4.2.0.4</version>
<version>4.2.0.5</version>
<authors>sunkaixuan</authors>
<owners>Landa</owners>
<licenseUrl>http://www.apache.org/licenses/LICENSE-2.0.html</licenseUrl>