- 优化 pgsql jsonb 映射,支持 List,mysql limit in 子查询;

This commit is contained in:
2881099
2021-11-02 00:38:06 +08:00
parent 65fe03a2ff
commit 3d5ca9bc7e
25 changed files with 192 additions and 22 deletions

View File

@@ -378,6 +378,7 @@ namespace FreeSql.Internal
objval = Utils.GetDataReaderValue(parent.CsType, objval);
if (parent.Property != null && parent.CsType != parent.Property.PropertyType)
objval = Utils.GetDataReaderValue(parent.Property.PropertyType, objval);
if (objval == DBNull.Value) objval = null;
return objval;
}
var ctorParmsLength = 0;
@@ -1116,7 +1117,7 @@ namespace FreeSql.Internal
if (fsql != null)
{
if (asSelectParentExp != null)
{ //执行 asSelect() 的关联OneToManyManyToMany
{ //执行 AsSelect() 的关联OneToManyManyToMany
if (fsqltables[0].Parameter == null)
{
fsqltables[0].Alias = $"tb_{fsqltables.Count}";
@@ -1287,15 +1288,30 @@ namespace FreeSql.Internal
case "ToOne":
case "First":
var tscClone2 = tsc.CloneDisableDiyParse();
tscClone2.subSelect001 = fsql as Select0Provider; //#405 Oracle within group(order by ..)
var fsqlSelect0p = fsql as Select0Provider;
tscClone2.subSelect001 = fsqlSelect0p; //#405 Oracle within group(order by ..)
tscClone2.isDisableDiyParse = false;
tscClone2._tables = fsqltables;
var exp3Args02 = (exp3.Arguments.FirstOrDefault() as UnaryExpression)?.Operand as LambdaExpression;
if (exp3Args02.Parameters.Count == 1 && exp3Args02.Parameters[0].Type.FullName.StartsWith("FreeSql.Internal.Model.HzyTuple`"))
exp3Args02 = new ReplaceHzyTupleToMultiParam().Modify(exp3Args02, fsqltables);
var sqlFirst = fsqlType.GetMethod("ToSql", new Type[] { typeof(string) })?.Invoke(fsql, new object[] { ExpressionLambdaToSql(exp3Args02, tscClone2) })?.ToString();
var sqlFirstField = ExpressionLambdaToSql(exp3Args02, tscClone2);
var sqlFirst = fsqlType.GetMethod("ToSql", new Type[] { typeof(string) })?.Invoke(fsql, new object[] { sqlFirstField })?.ToString();
if (string.IsNullOrEmpty(sqlFirst) == false)
{
if (fsqlSelect0p._limit > 0)
{
switch (_ado.DataType) //使用 Limit 后的 IN 子查询需要套一层
{
case DataType.MySql:
case DataType.OdbcMySql:
if (exp3.Method.Name == "ToList")
return $"( SELECT * FROM ({sqlFirst.Replace(" \r\n", " \r\n ")}) ftblmt50 )";
break;
}
}
return $"({sqlFirst.Replace(" \r\n", " \r\n ")})";
}
break;
}
}