- 修复 Ado.Query 查询字段重复时报错;#162 #165 #161 - 增加 FreeSql.Provider.MsAccess 支持 Access 数据库操作,已通过 2003/2007 版本测试;

This commit is contained in:
28810
2019-12-24 06:16:52 +08:00
parent d5ed1c8a30
commit a92c279c72
69 changed files with 10380 additions and 207 deletions

View File

@ -22,8 +22,13 @@ namespace FreeSql
Odbc,
/// <summary>
/// 国产数据库达梦
/// 武汉达梦数据库有限公司
/// </summary>
OdbcDameng,
/// <summary>
/// Microsoft Office Access 是由微软发布的关联式数据库管理系统
/// </summary>
MsAccess,
}
}

View File

@ -5,7 +5,7 @@
<Version>0.12.21</Version>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Authors>YeXiangQin</Authors>
<Description>FreeSql is the ORM in .NetCore, .NetFramework, And Xamarin. It supports Mysql, Postgresql, SqlServer, Oracle, Sqlite, And Odbc. 达梦</Description>
<Description>FreeSql is the ORM in .NetCore, .NetFramework, And Xamarin. It supports Mysql, Postgresql, SqlServer, Oracle, Sqlite, Odbc, 达梦, And Access</Description>
<PackageProjectUrl>https://github.com/2881099/FreeSql</PackageProjectUrl>
<RepositoryUrl>https://github.com/2881099/FreeSql</RepositoryUrl>
<RepositoryType>git</RepositoryType>
@ -28,7 +28,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="SafeObjectPool" Version="2.2.0" />
<PackageReference Include="SafeObjectPool" Version="2.2.1" />
<PackageReference Include="System.ValueTuple" Version="4.5.0" />
</ItemGroup>

View File

@ -486,7 +486,12 @@
</member>
<member name="F:FreeSql.DataType.OdbcDameng">
<summary>
国产数据库达梦
武汉达梦数据库有限公司
</summary>
</member>
<member name="F:FreeSql.DataType.MsAccess">
<summary>
Microsoft Office Access 是由微软发布的关联式数据库管理系统
</summary>
</member>
<member name="M:FreeSql.Extensions.EntityUtil.EntityUtilExtensions.GetEntityKeyString(IFreeSql,System.Type,System.Object,System.Boolean,System.String)">
@ -1725,7 +1730,7 @@
【linq to sql】专用方法不建议直接使用
</summary>
</member>
<member name="M:FreeSql.ISelectGrouping`2.ToSql``1(System.Linq.Expressions.Expression{System.Func{FreeSql.ISelectGroupingAggregate{`0,`1},``0}})">
<member name="M:FreeSql.ISelectGrouping`2.ToSql``1(System.Linq.Expressions.Expression{System.Func{FreeSql.ISelectGroupingAggregate{`0,`1},``0}},FreeSql.FieldAliasOptions)">
<summary>
返回即将执行的SQL语句
</summary>
@ -2200,137 +2205,6 @@
<param name="parms"></param>
<returns></returns>
</member>
<member name="M:FreeSql.IAdo.ExecuteReaderAsync(System.Func{System.Data.Common.DbDataReader,System.Threading.Tasks.Task},System.Data.CommandType,System.String,System.Data.Common.DbParameter[])">
<summary>
查询若使用读写分离查询【从库】条件cmdText.StartsWith("SELECT "),否则查询【主库】
</summary>
<param name="readerHander"></param>
<param name="cmdType"></param>
<param name="cmdText"></param>
<param name="cmdParms"></param>
</member>
<member name="M:FreeSql.IAdo.ExecuteReaderAsync(System.Func{System.Data.Common.DbDataReader,System.Threading.Tasks.Task},System.String,System.Object)">
<summary>
查询ExecuteReaderAsync(dr => {}, "select * from user where age > @age", new { age = 25 })
</summary>
<param name="cmdText"></param>
<param name="parms"></param>
</member>
<member name="M:FreeSql.IAdo.ExecuteArrayAsync(System.Data.CommandType,System.String,System.Data.Common.DbParameter[])">
<summary>
查询
</summary>
<param name="cmdText"></param>
<param name="cmdParms"></param>
</member>
<member name="M:FreeSql.IAdo.ExecuteArrayAsync(System.String,System.Object)">
<summary>
查询ExecuteArrayAsync("select * from user where age > @age", new { age = 25 })
</summary>
<param name="cmdText"></param>
<param name="parms"></param>
<returns></returns>
</member>
<member name="M:FreeSql.IAdo.ExecuteDataSetAsync(System.Data.CommandType,System.String,System.Data.Common.DbParameter[])">
<summary>
查询
</summary>
<param name="cmdText"></param>
<param name="cmdParms"></param>
</member>
<member name="M:FreeSql.IAdo.ExecuteDataSetAsync(System.String,System.Object)">
<summary>
查询ExecuteDataSetAsync("select * from user where age > @age; select 2", new { age = 25 })
</summary>
<param name="cmdText"></param>
<param name="parms"></param>
<returns></returns>
</member>
<member name="M:FreeSql.IAdo.ExecuteDataTableAsync(System.Data.CommandType,System.String,System.Data.Common.DbParameter[])">
<summary>
查询
</summary>
<param name="cmdText"></param>
<param name="cmdParms"></param>
</member>
<member name="M:FreeSql.IAdo.ExecuteDataTableAsync(System.String,System.Object)">
<summary>
查询ExecuteDataTableAsync("select * from user where age > @age", new { age = 25 })
</summary>
<param name="cmdText"></param>
<param name="parms"></param>
<returns></returns>
</member>
<member name="M:FreeSql.IAdo.ExecuteNonQueryAsync(System.Data.CommandType,System.String,System.Data.Common.DbParameter[])">
<summary>
在【主库】执行
</summary>
<param name="cmdType"></param>
<param name="cmdText"></param>
<param name="cmdParms"></param>
</member>
<member name="M:FreeSql.IAdo.ExecuteNonQueryAsync(System.String,System.Object)">
<summary>
在【主库】执行ExecuteNonQueryAsync("delete from user where age > @age", new { age = 25 })
</summary>
<param name="cmdText"></param>
<param name="parms"></param>
<returns></returns>
</member>
<member name="M:FreeSql.IAdo.ExecuteScalarAsync(System.Data.CommandType,System.String,System.Data.Common.DbParameter[])">
<summary>
在【主库】执行
</summary>
<param name="cmdType"></param>
<param name="cmdText"></param>
<param name="cmdParms"></param>
</member>
<member name="M:FreeSql.IAdo.ExecuteScalarAsync(System.String,System.Object)">
<summary>
在【主库】执行ExecuteScalarAsync("select 1 from user where age > @age", new { age = 25 })
</summary>
<param name="cmdText"></param>
<param name="parms"></param>
<returns></returns>
</member>
<member name="M:FreeSql.IAdo.QueryAsync``1(System.Data.CommandType,System.String,System.Data.Common.DbParameter[])">
<summary>
执行SQL返回对象集合QueryAsync&lt;User&gt;("select * from user where age > @age", new SqlParameter { ParameterName = "age", Value = 25 })
</summary>
<typeparam name="T"></typeparam>
<param name="cmdType"></param>
<param name="cmdText"></param>
<param name="cmdParms"></param>
<returns></returns>
</member>
<member name="M:FreeSql.IAdo.QueryAsync``1(System.String,System.Object)">
<summary>
执行SQL返回对象集合QueryAsync&lt;User&gt;("select * from user where age > @age", new { age = 25 })
</summary>
<typeparam name="T"></typeparam>
<param name="cmdText"></param>
<param name="parms"></param>
<returns></returns>
</member>
<member name="M:FreeSql.IAdo.QueryAsync``2(System.Data.CommandType,System.String,System.Data.Common.DbParameter[])">
<summary>
执行SQL返回对象集合Query&lt;User&gt;("select * from user where age > @age; select * from address", new SqlParameter { ParameterName = "age", Value = 25 })
</summary>
<typeparam name="T1"></typeparam>
<param name="cmdType"></param>
<param name="cmdText"></param>
<param name="cmdParms"></param>
<returns></returns>
</member>
<member name="M:FreeSql.IAdo.QueryAsync``2(System.String,System.Object)">
<summary>
执行SQL返回对象集合Query&lt;User&gt;("select * from user where age > @age; select * from address", new { age = 25 })
</summary>
<typeparam name="T1"></typeparam>
<param name="cmdText"></param>
<param name="parms"></param>
<returns></returns>
</member>
<member name="P:FreeSql.IAop.ParseExpression">
<summary>
可自定义解析表达式

View File

@ -224,6 +224,11 @@ namespace FreeSql
if (type == null) throw new Exception("缺少 FreeSql 数据库实现包FreeSql.Provider.Odbc.dll可前往 nuget 下载");
break;
case DataType.MsAccess:
type = Type.GetType("FreeSql.MsAccess.MsAccessProvider`1,FreeSql.Provider.MsAccess")?.MakeGenericType(typeof(TMark));
if (type == null) throw new Exception("缺少 FreeSql 数据库实现包FreeSql.Provider.MsAccess.dll可前往 nuget 下载");
break;
default: throw new Exception("未指定 UseConnectionString");
}
}

View File

@ -55,7 +55,7 @@ namespace FreeSql
/// <typeparam name="TReturn">返回类型</typeparam>
/// <param name="select">选择列</param>
/// <returns></returns>
string ToSql<TReturn>(Expression<Func<ISelectGroupingAggregate<TKey, TValue>, TReturn>> select);
string ToSql<TReturn>(Expression<Func<ISelectGroupingAggregate<TKey, TValue>, TReturn>> select, FieldAliasOptions fieldAlias = FieldAliasOptions.AsIndex);
/// <summary>
/// 返回即将执行的SQL语句
/// </summary>

View File

@ -37,8 +37,8 @@ namespace FreeSql.Internal
case ExpressionType.NegateChecked:
parent.DbField = $"-({ExpressionLambdaToSql(exp, getTSC())})";
field.Append(", ").Append(parent.DbField);
if (index >= 0) field.Append(" as").Append(++index);
else if (index == ReadAnonymousFieldAsCsName && string.IsNullOrEmpty(parent.CsName) == false) field.Append(" ").Append(parent.CsName);
if (index >= 0) field.Append(_common.FieldAsAlias($"as{++index}"));
else if (index == ReadAnonymousFieldAsCsName && string.IsNullOrEmpty(parent.CsName) == false) field.Append(_common.FieldAsAlias(parent.CsName));
return false;
case ExpressionType.Convert: return ReadAnonymousField(_tables, field, parent, ref index, (exp as UnaryExpression)?.Operand, getSelectGroupingMapString, whereCascadeExpression, isAllDtoMap);
case ExpressionType.Constant:
@ -56,8 +56,8 @@ namespace FreeSql.Internal
else
parent.DbField = _common.FormatSql("{0}", constExp?.Value);
field.Append(", ").Append(parent.DbField);
if (index >= 0) field.Append(" as").Append(++index);
else if (index == ReadAnonymousFieldAsCsName && string.IsNullOrEmpty(parent.CsName) == false) field.Append(" ").Append(parent.CsName);
if (index >= 0) field.Append(_common.FieldAsAlias($"as{++index}"));
else if (index == ReadAnonymousFieldAsCsName && string.IsNullOrEmpty(parent.CsName) == false) field.Append(_common.FieldAsAlias(parent.CsName));
return false;
case ExpressionType.Call:
var callExp = exp as MethodCallExpression;
@ -73,8 +73,8 @@ namespace FreeSql.Internal
else
parent.DbField = ExpressionLambdaToSql(exp, getTSC());
field.Append(", ").Append(parent.DbField);
if (index >= 0) field.Append(" as").Append(++index);
else if (index == ReadAnonymousFieldAsCsName && string.IsNullOrEmpty(parent.CsName) == false) field.Append(" ").Append(parent.CsName);
if (index >= 0) field.Append(_common.FieldAsAlias($"as{++index}"));
else if (index == ReadAnonymousFieldAsCsName && string.IsNullOrEmpty(parent.CsName) == false) field.Append(_common.FieldAsAlias(parent.CsName));
return false;
case ExpressionType.Parameter:
case ExpressionType.MemberAccess:
@ -97,7 +97,7 @@ namespace FreeSql.Internal
MapType = map[idx].Column.Attribute.MapType
};
field.Append(", ").Append(_common.QuoteReadColumn(child.MapType, child.DbField));
if (index >= 0) field.Append(" as").Append(++index);
if (index >= 0) field.Append(_common.FieldAsAlias($"as{++index}"));
parent.Childs.Add(child);
}
}
@ -106,8 +106,8 @@ namespace FreeSql.Internal
parent.CsType = exp.Type;
parent.DbField = ExpressionLambdaToSql(exp, getTSC());
field.Append(", ").Append(parent.DbField);
if (index >= 0) field.Append(" as").Append(++index);
else if (index == ReadAnonymousFieldAsCsName && string.IsNullOrEmpty(parent.CsName) == false) field.Append(" ").Append(parent.CsName);
if (index >= 0) field.Append(_common.FieldAsAlias($"as{++index}"));
else if (index == ReadAnonymousFieldAsCsName && string.IsNullOrEmpty(parent.CsName) == false) field.Append(_common.FieldAsAlias(parent.CsName));
parent.MapType = SearchColumnByField(_tables, null, parent.DbField)?.Attribute.MapType ?? exp.Type;
return false;
}
@ -157,7 +157,7 @@ namespace FreeSql.Internal
{
child.DbField = $"{dtTb.Alias}.{_common.QuoteSqlName(trydtocol.Attribute.Name)}";
field.Append(", ").Append(child.DbField);
if (index >= 0) field.Append(" as").Append(++index);
if (index >= 0) field.Append(_common.FieldAsAlias($"as{++index}"));
}
break;
}
@ -240,7 +240,7 @@ namespace FreeSql.Internal
{
child.DbField = $"{dtTb.Alias}.{_common.QuoteSqlName(trydtocol.Attribute.Name)}";
field.Append(", ").Append(child.DbField);
if (index >= 0) field.Append(" as").Append(++index);
if (index >= 0) field.Append(_common.FieldAsAlias($"as{++index}"));
}
break;
}
@ -251,8 +251,8 @@ namespace FreeSql.Internal
}
parent.DbField = $"({ExpressionLambdaToSql(exp, getTSC())})";
field.Append(", ").Append(parent.DbField);
if (index >= 0) field.Append(" as").Append(++index);
else if (index == ReadAnonymousFieldAsCsName && string.IsNullOrEmpty(parent.CsName) == false) field.Append(" ").Append(parent.CsName);
if (index >= 0) field.Append(_common.FieldAsAlias($"as{++index}"));
else if (index == ReadAnonymousFieldAsCsName && string.IsNullOrEmpty(parent.CsName) == false) field.Append(_common.FieldAsAlias(parent.CsName));
return false;
}
public object ReadAnonymous(ReadAnonymousTypeInfo parent, DbDataReader dr, ref int index, bool notRead, ReadAnonymousDbValueRef dbValue)
@ -593,7 +593,7 @@ namespace FreeSql.Internal
case ExpressionType.Constant: return formatSql((exp as ConstantExpression)?.Value, tsc.mapType, tsc.mapColumnTmp, null);
case ExpressionType.Conditional:
var condExp = exp as ConditionalExpression;
return $"case when {ExpressionLambdaToSql(condExp.Test, tsc)} then {ExpressionLambdaToSql(condExp.IfTrue, tsc)} else {ExpressionLambdaToSql(condExp.IfFalse, tsc)} end";
return _common.IIF(ExpressionLambdaToSql(condExp.Test, tsc), ExpressionLambdaToSql(condExp.IfTrue, tsc), ExpressionLambdaToSql(condExp.IfFalse, tsc));
case ExpressionType.Call:
tsc.mapType = null;
var exp3 = exp as MethodCallExpression;

View File

@ -111,6 +111,7 @@ namespace FreeSql.Internal.CommonProvider
for (var a = 0; a < dr.FieldCount; a++)
{
var name = dr.GetName(a);
if (dic.ContainsKey(name)) continue;
sbflag.Append(name).Append(":").Append(a).Append(",");
dic.Add(name, a);
}
@ -153,6 +154,7 @@ namespace FreeSql.Internal.CommonProvider
for (var a = 0; a < dr.FieldCount; a++)
{
var name = dr.GetName(a);
if (dic.ContainsKey(name)) continue;
sbflag.Append(name).Append(":").Append(a).Append(",");
dic.Add(name, a);
}
@ -169,6 +171,7 @@ namespace FreeSql.Internal.CommonProvider
for (var a = 0; a < dr.FieldCount; a++)
{
var name = dr.GetName(a);
if (dic.ContainsKey(name)) continue;
sbflag.Append(name).Append(":").Append(a).Append(",");
dic.Add(name, a);
}
@ -219,6 +222,7 @@ namespace FreeSql.Internal.CommonProvider
for (var a = 0; a < dr.FieldCount; a++)
{
var name = dr.GetName(a);
if (dic.ContainsKey(name)) continue;
sbflag.Append(name).Append(":").Append(a).Append(",");
dic.Add(name, a);
}
@ -235,6 +239,7 @@ namespace FreeSql.Internal.CommonProvider
for (var a = 0; a < dr.FieldCount; a++)
{
var name = dr.GetName(a);
if (dic.ContainsKey(name)) continue;
sbflag.Append(name).Append(":").Append(a).Append(",");
dic.Add(name, a);
}
@ -251,6 +256,7 @@ namespace FreeSql.Internal.CommonProvider
for (var a = 0; a < dr.FieldCount; a++)
{
var name = dr.GetName(a);
if (dic.ContainsKey(name)) continue;
sbflag.Append(name).Append(":").Append(a).Append(",");
dic.Add(name, a);
}
@ -307,6 +313,7 @@ namespace FreeSql.Internal.CommonProvider
for (var a = 0; a < dr.FieldCount; a++)
{
var name = dr.GetName(a);
if (dic.ContainsKey(name)) continue;
sbflag.Append(name).Append(":").Append(a).Append(",");
dic.Add(name, a);
}
@ -323,6 +330,7 @@ namespace FreeSql.Internal.CommonProvider
for (var a = 0; a < dr.FieldCount; a++)
{
var name = dr.GetName(a);
if (dic.ContainsKey(name)) continue;
sbflag.Append(name).Append(":").Append(a).Append(",");
dic.Add(name, a);
}
@ -339,6 +347,7 @@ namespace FreeSql.Internal.CommonProvider
for (var a = 0; a < dr.FieldCount; a++)
{
var name = dr.GetName(a);
if (dic.ContainsKey(name)) continue;
sbflag.Append(name).Append(":").Append(a).Append(",");
dic.Add(name, a);
}
@ -355,6 +364,7 @@ namespace FreeSql.Internal.CommonProvider
for (var a = 0; a < dr.FieldCount; a++)
{
var name = dr.GetName(a);
if (dic.ContainsKey(name)) continue;
sbflag.Append(name).Append(":").Append(a).Append(",");
dic.Add(name, a);
}
@ -417,6 +427,7 @@ namespace FreeSql.Internal.CommonProvider
for (var a = 0; a < dr.FieldCount; a++)
{
var name = dr.GetName(a);
if (dic.ContainsKey(name)) continue;
sbflag.Append(name).Append(":").Append(a).Append(",");
dic.Add(name, a);
}
@ -433,6 +444,7 @@ namespace FreeSql.Internal.CommonProvider
for (var a = 0; a < dr.FieldCount; a++)
{
var name = dr.GetName(a);
if (dic.ContainsKey(name)) continue;
sbflag.Append(name).Append(":").Append(a).Append(",");
dic.Add(name, a);
}
@ -449,6 +461,7 @@ namespace FreeSql.Internal.CommonProvider
for (var a = 0; a < dr.FieldCount; a++)
{
var name = dr.GetName(a);
if (dic.ContainsKey(name)) continue;
sbflag.Append(name).Append(":").Append(a).Append(",");
dic.Add(name, a);
}
@ -465,6 +478,7 @@ namespace FreeSql.Internal.CommonProvider
for (var a = 0; a < dr.FieldCount; a++)
{
var name = dr.GetName(a);
if (dic.ContainsKey(name)) continue;
sbflag.Append(name).Append(":").Append(a).Append(",");
dic.Add(name, a);
}
@ -481,6 +495,7 @@ namespace FreeSql.Internal.CommonProvider
for (var a = 0; a < dr.FieldCount; a++)
{
var name = dr.GetName(a);
if (dic.ContainsKey(name)) continue;
sbflag.Append(name).Append(":").Append(a).Append(",");
dic.Add(name, a);
}
@ -655,7 +670,12 @@ namespace FreeSql.Internal.CommonProvider
if (ret.Tables.Count <= result)
{
dt = ret.Tables.Add();
for (var a = 0; a < dr.FieldCount; a++) dt.Columns.Add(dr.GetName(a));
for (var a = 0; a < dr.FieldCount; a++)
{
var name = dr.GetName(a);
if (dt.Columns.Contains(name)) name = $"{name}_{Guid.NewGuid().ToString("N").Substring(0, 4)}";
dt.Columns.Add(name);
}
}
object[] values = new object[dt.Columns.Count];
dr.GetValues(values);
@ -674,7 +694,12 @@ namespace FreeSql.Internal.CommonProvider
ExecuteReader(connection, transaction, dr =>
{
if (ret.Columns.Count == 0)
for (var a = 0; a < dr.FieldCount; a++) ret.Columns.Add(dr.GetName(a));
for (var a = 0; a < dr.FieldCount; a++)
{
var name = dr.GetName(a);
if (ret.Columns.Contains(name)) name = $"{name}_{Guid.NewGuid().ToString("N").Substring(0, 4)}";
ret.Columns.Add(name);
}
object[] values = new object[ret.Columns.Count];
dr.GetValues(values);
ret.Rows.Add(values);

View File

@ -35,6 +35,7 @@ namespace FreeSql.Internal.CommonProvider
for (var a = 0; a < dr.FieldCount; a++)
{
var name = dr.GetName(a);
if (dic.ContainsKey(name)) continue;
sbflag.Append(name).Append(":").Append(a).Append(",");
dic.Add(name, a);
}
@ -78,6 +79,7 @@ namespace FreeSql.Internal.CommonProvider
for (var a = 0; a < dr.FieldCount; a++)
{
var name = dr.GetName(a);
if (dic.ContainsKey(name)) continue;
sbflag.Append(name).Append(":").Append(a).Append(",");
dic.Add(name, a);
}
@ -94,6 +96,7 @@ namespace FreeSql.Internal.CommonProvider
for (var a = 0; a < dr.FieldCount; a++)
{
var name = dr.GetName(a);
if (dic.ContainsKey(name)) continue;
sbflag.Append(name).Append(":").Append(a).Append(",");
dic.Add(name, a);
}
@ -145,6 +148,7 @@ namespace FreeSql.Internal.CommonProvider
for (var a = 0; a < dr.FieldCount; a++)
{
var name = dr.GetName(a);
if (dic.ContainsKey(name)) continue;
sbflag.Append(name).Append(":").Append(a).Append(",");
dic.Add(name, a);
}
@ -161,6 +165,7 @@ namespace FreeSql.Internal.CommonProvider
for (var a = 0; a < dr.FieldCount; a++)
{
var name = dr.GetName(a);
if (dic.ContainsKey(name)) continue;
sbflag.Append(name).Append(":").Append(a).Append(",");
dic.Add(name, a);
}
@ -177,6 +182,7 @@ namespace FreeSql.Internal.CommonProvider
for (var a = 0; a < dr.FieldCount; a++)
{
var name = dr.GetName(a);
if (dic.ContainsKey(name)) continue;
sbflag.Append(name).Append(":").Append(a).Append(",");
dic.Add(name, a);
}
@ -234,6 +240,7 @@ namespace FreeSql.Internal.CommonProvider
for (var a = 0; a < dr.FieldCount; a++)
{
var name = dr.GetName(a);
if (dic.ContainsKey(name)) continue;
sbflag.Append(name).Append(":").Append(a).Append(",");
dic.Add(name, a);
}
@ -250,6 +257,7 @@ namespace FreeSql.Internal.CommonProvider
for (var a = 0; a < dr.FieldCount; a++)
{
var name = dr.GetName(a);
if (dic.ContainsKey(name)) continue;
sbflag.Append(name).Append(":").Append(a).Append(",");
dic.Add(name, a);
}
@ -266,6 +274,7 @@ namespace FreeSql.Internal.CommonProvider
for (var a = 0; a < dr.FieldCount; a++)
{
var name = dr.GetName(a);
if (dic.ContainsKey(name)) continue;
sbflag.Append(name).Append(":").Append(a).Append(",");
dic.Add(name, a);
}
@ -282,6 +291,7 @@ namespace FreeSql.Internal.CommonProvider
for (var a = 0; a < dr.FieldCount; a++)
{
var name = dr.GetName(a);
if (dic.ContainsKey(name)) continue;
sbflag.Append(name).Append(":").Append(a).Append(",");
dic.Add(name, a);
}
@ -345,6 +355,7 @@ namespace FreeSql.Internal.CommonProvider
for (var a = 0; a < dr.FieldCount; a++)
{
var name = dr.GetName(a);
if (dic.ContainsKey(name)) continue;
sbflag.Append(name).Append(":").Append(a).Append(",");
dic.Add(name, a);
}
@ -361,6 +372,7 @@ namespace FreeSql.Internal.CommonProvider
for (var a = 0; a < dr.FieldCount; a++)
{
var name = dr.GetName(a);
if (dic.ContainsKey(name)) continue;
sbflag.Append(name).Append(":").Append(a).Append(",");
dic.Add(name, a);
}
@ -377,6 +389,7 @@ namespace FreeSql.Internal.CommonProvider
for (var a = 0; a < dr.FieldCount; a++)
{
var name = dr.GetName(a);
if (dic.ContainsKey(name)) continue;
sbflag.Append(name).Append(":").Append(a).Append(",");
dic.Add(name, a);
}
@ -393,6 +406,7 @@ namespace FreeSql.Internal.CommonProvider
for (var a = 0; a < dr.FieldCount; a++)
{
var name = dr.GetName(a);
if (dic.ContainsKey(name)) continue;
sbflag.Append(name).Append(":").Append(a).Append(",");
dic.Add(name, a);
}
@ -409,6 +423,7 @@ namespace FreeSql.Internal.CommonProvider
for (var a = 0; a < dr.FieldCount; a++)
{
var name = dr.GetName(a);
if (dic.ContainsKey(name)) continue;
sbflag.Append(name).Append(":").Append(a).Append(",");
dic.Add(name, a);
}
@ -585,7 +600,12 @@ namespace FreeSql.Internal.CommonProvider
if (ret.Tables.Count <= result)
{
dt = ret.Tables.Add();
for (var a = 0; a < dr.FieldCount; a++) dt.Columns.Add(dr.GetName(a));
for (var a = 0; a < dr.FieldCount; a++)
{
var name = dr.GetName(a);
if (dt.Columns.Contains(name)) name = $"{name}_{Guid.NewGuid().ToString("N").Substring(0, 4)}";
dt.Columns.Add(name);
}
}
object[] values = new object[dt.Columns.Count];
for (int a = 0; a < values.Length; a++) if (!await dr.IsDBNullAsync(a)) values[a] = await dr.GetFieldValueAsync<object>(a);
@ -604,7 +624,12 @@ namespace FreeSql.Internal.CommonProvider
await ExecuteReaderAsync(connection, transaction, async dr =>
{
if (ret.Columns.Count == 0)
for (var a = 0; a < dr.FieldCount; a++) ret.Columns.Add(dr.GetName(a));
for (var a = 0; a < dr.FieldCount; a++)
{
var name = dr.GetName(a);
if (ret.Columns.Contains(name)) name = $"{name}_{Guid.NewGuid().ToString("N").Substring(0, 4)}";
ret.Columns.Add(name);
}
object[] values = new object[ret.Columns.Count];
for (int a = 0; a < values.Length; a++) if (!await dr.IsDBNullAsync(a)) values[a] = await dr.GetFieldValueAsync<object>(a);
ret.Rows.Add(values);

View File

@ -88,7 +88,7 @@ namespace FreeSql.Internal.CommonProvider
return this;
}
public IInsert<T1> BatchOptions(int valuesLimit, int parameterLimit, bool autoTransaction = true)
public virtual IInsert<T1> BatchOptions(int valuesLimit, int parameterLimit, bool autoTransaction = true)
{
_batchValuesLimit = valuesLimit;
_batchParameterLimit = parameterLimit;
@ -170,6 +170,8 @@ namespace FreeSql.Internal.CommonProvider
{
valuesLimit = valuesLimit - 1;
parameterLimit = parameterLimit - 1;
if (valuesLimit <= 0) valuesLimit = 1;
if (parameterLimit <= 0) parameterLimit = 999;
if (_source == null || _source.Any() == false) return new List<T1>[0];
if (_source.Count == 1) return new[] { _source };

View File

@ -155,7 +155,7 @@ namespace FreeSql.Internal.CommonProvider
public bool Any()
{
this.Limit(1);
return this.ToList<int>("1 as1").Sum() > 0; //这里的 Sum 为了分表查询
return this.ToList<int>($"{1}{_commonUtils.FieldAsAlias("as1")}").Sum() > 0; //这里的 Sum 为了分表查询
}
public long Count()
@ -164,7 +164,7 @@ namespace FreeSql.Internal.CommonProvider
_orderby = null; //解决 select count(1) from t order by id 这样的 SQL 错误
try
{
return this.ToList<int>("count(1) as1").Sum(); //这里的 Sum 为了分表查询
return this.ToList<int>($"count(1){_commonUtils.FieldAsAlias("as1")}").Sum(); //这里的 Sum 为了分表查询
}
finally
{
@ -599,7 +599,7 @@ namespace FreeSql.Internal.CommonProvider
var quoteName = _commonUtils.QuoteSqlName(col.Attribute.Name);
field.Append(_commonUtils.QuoteReadColumn(col.Attribute.MapType, $"{tbi.Alias}.{quoteName}"));
++index;
if (dicfield.ContainsKey(quoteName)) field.Append(" as").Append(index);
if (dicfield.ContainsKey(quoteName)) field.Append(_commonUtils.FieldAsAlias($"as{index}"));
else dicfield.Add(quoteName, true);
++colidx;
}
@ -730,7 +730,7 @@ namespace FreeSql.Internal.CommonProvider
var quoteName = _commonUtils.QuoteSqlName(col.Attribute.Name);
field.Append(_commonUtils.QuoteReadColumn(col.Attribute.MapType, $"{tb.Alias}.{quoteName}"));
++index;
if (dicfield.ContainsKey(quoteName)) field.Append(" as").Append(index);
if (dicfield.ContainsKey(quoteName)) field.Append(_commonUtils.FieldAsAlias($"as{index}"));
else dicfield.Add(quoteName, true);
}
else
@ -754,7 +754,7 @@ namespace FreeSql.Internal.CommonProvider
field.Append(_commonUtils.QuoteReadColumn(col2.Attribute.MapType, $"{tb2.Alias}.{quoteName}"));
++index;
++otherindex;
if (dicfield.ContainsKey(quoteName)) field.Append(" as").Append(index);
if (dicfield.ContainsKey(quoteName)) field.Append(_commonUtils.FieldAsAlias($"as{index}"));
else dicfield.Add(quoteName, true);
}
}
@ -851,7 +851,7 @@ namespace FreeSql.Internal.CommonProvider
var quoteName = _commonUtils.QuoteSqlName(col.Attribute.Name);
field.Append(_commonUtils.QuoteReadColumn(col.Attribute.MapType, $"{tb.Alias}.{quoteName}"));
++index;
if (dicfield.ContainsKey(quoteName)) field.Append(" as").Append(index);
if (dicfield.ContainsKey(quoteName)) field.Append(_commonUtils.FieldAsAlias($"as{index}"));
else dicfield.Add(quoteName, true);
}
else
@ -868,7 +868,7 @@ namespace FreeSql.Internal.CommonProvider
var quoteName = _commonUtils.QuoteSqlName(col2.Attribute.Name);
field.Append(_commonUtils.QuoteReadColumn(col2.Attribute.MapType, $"{tb2.Alias}.{quoteName}"));
++index;
if (dicfield.ContainsKey(quoteName)) field.Append(" as").Append(index);
if (dicfield.ContainsKey(quoteName)) field.Append(_commonUtils.FieldAsAlias($"as{index}"));
else dicfield.Add(quoteName, true);
child.Childs.Add(new ReadAnonymousTypeInfo
{
@ -946,6 +946,8 @@ namespace FreeSql.Internal.CommonProvider
if (_orm.CodeFirst.IsSyncStructureToUpper) name = name.ToUpper();
if (_orm.CodeFirst.IsAutoSyncStructure) _orm.CodeFirst.SyncStructure(tb.Table.Type, name);
}
else
name = name.Replace("\r\n", "\r\n ");
}
dict.Add(tb.Table.Type, name);
}
@ -1035,12 +1037,12 @@ namespace FreeSql.Internal.CommonProvider
protected double InternalAvg(Expression exp)
{
var list = this.ToList<double>($"avg({_commonExpression.ExpressionSelectColumn_MemberAccess(_tables, null, SelectTableInfoType.From, exp, true, null)}) as1");
var list = this.ToList<double>($"avg({_commonExpression.ExpressionSelectColumn_MemberAccess(_tables, null, SelectTableInfoType.From, exp, true, null)}){_commonUtils.FieldAsAlias("as1")}");
return list.Sum() / list.Count;
}
protected TMember InternalMax<TMember>(Expression exp) => this.ToList<TMember>($"max({_commonExpression.ExpressionSelectColumn_MemberAccess(_tables, null, SelectTableInfoType.From, exp, true, null)}) as1").Max();
protected TMember InternalMin<TMember>(Expression exp) => this.ToList<TMember>($"min({_commonExpression.ExpressionSelectColumn_MemberAccess(_tables, null, SelectTableInfoType.From, exp, true, null)}) as1").Min();
protected decimal InternalSum(Expression exp) => this.ToList<decimal>($"sum({_commonExpression.ExpressionSelectColumn_MemberAccess(_tables, null, SelectTableInfoType.From, exp, true, null)}) as1").Sum();
protected TMember InternalMax<TMember>(Expression exp) => this.ToList<TMember>($"max({_commonExpression.ExpressionSelectColumn_MemberAccess(_tables, null, SelectTableInfoType.From, exp, true, null)}){_commonUtils.FieldAsAlias("as1")}").Max();
protected TMember InternalMin<TMember>(Expression exp) => this.ToList<TMember>($"min({_commonExpression.ExpressionSelectColumn_MemberAccess(_tables, null, SelectTableInfoType.From, exp, true, null)}){_commonUtils.FieldAsAlias("as1")}").Min();
protected decimal InternalSum(Expression exp) => this.ToList<decimal>($"sum({_commonExpression.ExpressionSelectColumn_MemberAccess(_tables, null, SelectTableInfoType.From, exp, true, null)}){_commonUtils.FieldAsAlias("as1")}").Sum();
protected ISelectGrouping<TKey, TValue> InternalGroupBy<TKey, TValue>(Expression columns)
{
@ -1118,7 +1120,7 @@ namespace FreeSql.Internal.CommonProvider
async public Task<bool> AnyAsync()
{
this.Limit(1);
return (await this.ToListAsync<int>("1 as1")).Sum() > 0; //这里的 Sum 为了分表查询
return (await this.ToListAsync<int>($"1{_commonUtils.FieldAsAlias("as1")}")).Sum() > 0; //这里的 Sum 为了分表查询
}
async public Task<long> CountAsync()
@ -1127,7 +1129,7 @@ namespace FreeSql.Internal.CommonProvider
_orderby = null;
try
{
return (await this.ToListAsync<int>("count(1) as1")).Sum(); //这里的 Sum 为了分表查询
return (await this.ToListAsync<int>($"count(1){_commonUtils.FieldAsAlias("as1")}")).Sum(); //这里的 Sum 为了分表查询
}
finally
{
@ -1312,12 +1314,12 @@ namespace FreeSql.Internal.CommonProvider
async protected Task<double> InternalAvgAsync(Expression exp)
{
var list = await this.ToListAsync<double>($"avg({_commonExpression.ExpressionSelectColumn_MemberAccess(_tables, null, SelectTableInfoType.From, exp, true, null)}) as1");
var list = await this.ToListAsync<double>($"avg({_commonExpression.ExpressionSelectColumn_MemberAccess(_tables, null, SelectTableInfoType.From, exp, true, null)}){_commonUtils.FieldAsAlias("as1")}");
return list.Sum() / list.Count;
}
async protected Task<TMember> InternalMaxAsync<TMember>(Expression exp) => (await this.ToListAsync<TMember>($"max({_commonExpression.ExpressionSelectColumn_MemberAccess(_tables, null, SelectTableInfoType.From, exp, true, null)}) as1")).Max();
async protected Task<TMember> InternalMinAsync<TMember>(Expression exp) => (await this.ToListAsync<TMember>($"min({_commonExpression.ExpressionSelectColumn_MemberAccess(_tables, null, SelectTableInfoType.From, exp, true, null)}) as1")).Min();
async protected Task<decimal> InternalSumAsync(Expression exp) => (await this.ToListAsync<decimal>($"sum({_commonExpression.ExpressionSelectColumn_MemberAccess(_tables, null, SelectTableInfoType.From, exp, true, null)}) as1")).Sum();
async protected Task<TMember> InternalMaxAsync<TMember>(Expression exp) => (await this.ToListAsync<TMember>($"max({_commonExpression.ExpressionSelectColumn_MemberAccess(_tables, null, SelectTableInfoType.From, exp, true, null)}){_commonUtils.FieldAsAlias("as1")}")).Max();
async protected Task<TMember> InternalMinAsync<TMember>(Expression exp) => (await this.ToListAsync<TMember>($"min({_commonExpression.ExpressionSelectColumn_MemberAccess(_tables, null, SelectTableInfoType.From, exp, true, null)}){_commonUtils.FieldAsAlias("as1")}")).Min();
async protected Task<decimal> InternalSumAsync(Expression exp) => (await this.ToListAsync<decimal>($"sum({_commonExpression.ExpressionSelectColumn_MemberAccess(_tables, null, SelectTableInfoType.From, exp, true, null)}){_commonUtils.FieldAsAlias("as1")}")).Sum();
protected Task<List<TReturn>> InternalToListAsync<TReturn>(Expression select) => this.ToListMapReaderAsync<TReturn>(this.GetExpressionField(select));

View File

@ -56,7 +56,7 @@ namespace FreeSql.Internal.CommonProvider
case "Where": this.InternalWhere(expCall.Arguments[0]); break;
case "WhereIf":
var whereIfCond = _commonExpression.ExpressionSelectColumn_MemberAccess(null, null, SelectTableInfoType.From, expCall.Arguments[0], false, null);
if (whereIfCond == "1" || whereIfCond == "'t'")
if (whereIfCond == "1" || whereIfCond == "'t'" || whereIfCond == "-1") //MsAccess -1
this.InternalWhere(expCall.Arguments[1]);
break;
case "OrderBy":
@ -73,7 +73,7 @@ namespace FreeSql.Internal.CommonProvider
if (expCall.Arguments.Count == 2 && expCall.Arguments[0].Type == typeof(bool))
{
var ifcond = _commonExpression.ExpressionSelectColumn_MemberAccess(null, null, SelectTableInfoType.From, expCall.Arguments[0], false, null);
if (ifcond == "1" || ifcond == "'t'")
if (ifcond == "1" || ifcond == "'t'" || ifcond == "-1")//MsAccess -1
this.InternalOrderByDescending(expCall.Arguments.LastOrDefault());
break;
}

View File

@ -121,11 +121,11 @@ namespace FreeSql.Internal.CommonProvider
public List<TReturn> Select<TReturn>(Expression<Func<ISelectGroupingAggregate<TKey, TValue>, TReturn>> select) => ToList(select);
public string ToSql<TReturn>(Expression<Func<ISelectGroupingAggregate<TKey, TValue>, TReturn>> select)
public string ToSql<TReturn>(Expression<Func<ISelectGroupingAggregate<TKey, TValue>, TReturn>> select, FieldAliasOptions fieldAlias = FieldAliasOptions.AsIndex)
{
var map = new ReadAnonymousTypeInfo();
var field = new StringBuilder();
var index = 0;
var index = fieldAlias == FieldAliasOptions.AsProperty ? CommonExpression.ReadAnonymousFieldAsCsName : 0;
_comonExp.ReadAnonymousField(null, field, map, ref index, select, getSelectGroupingMapString, null, true);
var method = _select.GetType().GetMethod("ToSql", new[] { typeof(string) });
@ -163,7 +163,7 @@ namespace FreeSql.Internal.CommonProvider
return this;
}
public long Count() => long.TryParse(string.Concat(_orm.Ado.ExecuteScalar($"select count(1) from ({this.ToSql("1 as1")}) fta")), out var trylng) ? trylng : default(long);
public long Count() => long.TryParse(string.Concat(_orm.Ado.ExecuteScalar($"select count(1) from ({this.ToSql($"1{_comonExp._common.FieldAsAlias("as1")}")}) fta")), out var trylng) ? trylng : default(long);
public ISelectGrouping<TKey, TValue> Count(out long count)
{
count = this.Count();
@ -172,7 +172,7 @@ namespace FreeSql.Internal.CommonProvider
#if net40
#else
async public Task<long> CountAsync() => long.TryParse(string.Concat(await _orm.Ado.ExecuteScalarAsync($"select count(1) from ({this.ToSql("1 as1")}) fta")), out var trylng) ? trylng : default(long);
async public Task<long> CountAsync() => long.TryParse(string.Concat(await _orm.Ado.ExecuteScalarAsync($"select count(1) from ({this.ToSql($"1{_comonExp._common.FieldAsAlias("as1")}")}) fta")), out var trylng) ? trylng : default(long);
public Task<List<TReturn>> ToListAsync<TReturn>(Expression<Func<ISelectGroupingAggregate<TKey, TValue>, TReturn>> select)
{

View File

@ -93,7 +93,7 @@ namespace FreeSql.Internal.CommonProvider
return this;
}
public IUpdate<T1> BatchOptions(int rowsLimit, int parameterLimit, bool autoTransaction = true)
public virtual IUpdate<T1> BatchOptions(int rowsLimit, int parameterLimit, bool autoTransaction = true)
{
_batchRowsLimit = rowsLimit;
_batchParameterLimit = parameterLimit;
@ -117,6 +117,8 @@ namespace FreeSql.Internal.CommonProvider
{
valuesLimit = valuesLimit - 1;
parameterLimit = parameterLimit - 1;
if (valuesLimit <= 0) valuesLimit = 1;
if (parameterLimit <= 0) parameterLimit = 999;
if (_source == null || _source.Any() == false) return new List<T1>[0];
if (_source.Count == 1) return new[] { _source };

View File

@ -38,6 +38,8 @@ namespace FreeSql.Internal
public abstract string NowUtc { get; }
public abstract string QuoteWriteParamter(Type type, string paramterName);
public abstract string QuoteReadColumn(Type type, string columnName);
public virtual string FieldAsAlias(string alias) => $" {alias}";
public virtual string IIF(string test, string ifTrue, string ifElse) => $"case when {test} then {ifTrue} else {ifElse} end";
public IFreeSql _orm { get; set; }
public ICodeFirst CodeFirst => _orm.CodeFirst;

View File

@ -199,7 +199,7 @@ namespace FreeSql.Internal
{
case DataType.MySql:
case DataType.OdbcMySql:
if (strlen < 0) colattr.DbType = "text";
if (strlen < 0) colattr.DbType = "TEXT";
else colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1({strlen})");
break;
case DataType.SqlServer:
@ -209,7 +209,7 @@ namespace FreeSql.Internal
break;
case DataType.PostgreSQL:
case DataType.OdbcPostgreSQL:
if (strlen < 0) colattr.DbType = "text";
if (strlen < 0) colattr.DbType = "TEXT";
else colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1({strlen})");
break;
case DataType.Oracle:
@ -219,7 +219,12 @@ namespace FreeSql.Internal
else colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1({strlen})");
break;
case DataType.Sqlite:
if (strlen < 0) colattr.DbType = "text";
if (strlen < 0) colattr.DbType = "TEXT";
else colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1({strlen})");
break;
case DataType.MsAccess:
charPatten = @"(CHAR|CHAR2|CHARACTER|TEXT)\s*(\([^\)]*\))?";
if (strlen < 0) colattr.DbType = "LONGTEXT";
else colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1({strlen})");
break;
}