diff --git a/Examples/base_entity/AspNetRoleClaims/ids_api.db b/Examples/base_entity/AspNetRoleClaims/ids_api.db index a45d6fa32..41420d00c 100644 Binary files a/Examples/base_entity/AspNetRoleClaims/ids_api.db and b/Examples/base_entity/AspNetRoleClaims/ids_api.db differ diff --git a/Examples/base_entity/Program.cs b/Examples/base_entity/Program.cs index 5808016c6..a2859f7dc 100644 --- a/Examples/base_entity/Program.cs +++ b/Examples/base_entity/Program.cs @@ -366,11 +366,6 @@ namespace base_entity public int aa { get; set; } } - public class JoinConditionAttribute : Attribute - { - public string Condition { get; set; } - public JoinConditionAttribute(string condition) => Condition = condition; - } public class JoinTest01 { public int id { get; set; } @@ -382,8 +377,10 @@ namespace base_entity [Column(MapType = typeof(int))] public JoinTest01Enum JoinTest01Enum2 { get; set; } - [JoinCondition("a.parentcode = b.code")] + [Navigate(nameof(parentcode), TempPrimary = nameof(JoinTest01.code))] public JoinTest01 Parent { get; set; } + [Navigate(nameof(JoinTest01.parentcode), TempPrimary = nameof(code))] + public List Childs { get; set; } } public enum JoinTest01Enum { f1, f2, f3 } @@ -572,6 +569,14 @@ namespace base_entity #endregion fsql.UseJsonMap(); + var joinsql1 = fsql.Select() + .Include(a => a.Parent.Parent) + .Where(a => a.Parent.Parent.code == "001") + .Where(a => a.JoinTest01Enum == JoinTest01Enum.f3.ToString()) + .Where(a => object.Equals(a.JoinTest01Enum, JoinTest01Enum.f3)) + .Where(a => new[] { JoinTest01Enum.f2, JoinTest01Enum.f3 }.Contains(a.JoinTest01Enum2)) + .ToSql(); + var atimpl = fsql.CodeFirst.GetTableByEntity(typeof(AsTableLog)) .AsTableImpl; @@ -899,53 +904,7 @@ namespace base_entity }); var sqldel4 = fsql.DeleteDict(diclist).AsTable("table1").ToSql(); - fsql.Aop.ParseExpression += (_, e) => - { - if (e.Expression is MemberExpression memExp == false) return; - ParameterExpression parmExp = null; - var exps = new List(); - exps.Add(memExp); - while (memExp.Expression != null) - { - if (memExp.Expression is MemberExpression parentExp) - { - exps.Add(parentExp); - memExp = parentExp; - if (fsql.CodeFirst.GetTableByEntity(memExp.Type) == null) return; - continue; - } - if (memExp.Expression is ParameterExpression parmExp2) - { - parmExp = parmExp2; - break; - } - return; - } - if (parmExp == null) return; - if (e.Tables == null) return; - var oldTables = e.Tables.ToArray(); - var result = e.FreeParse(e.Expression); - for (var a = oldTables.Length; a < e.Tables.Count; a++) - { - if (string.IsNullOrEmpty(e.Tables[a].NavigateCondition) == false) continue; - var parentTableAlias = e.Tables[a].Alias?.Split(new[] { "__" }, StringSplitOptions.None); - if (parentTableAlias == null || parentTableAlias.Length <= 1) continue; - var parentTable = e.Tables.Where(c => c.Alias == string.Join("__", parentTableAlias.Take(parentTableAlias.Length - 1))).FirstOrDefault(); - if (parentTable == null || parentTable.Table.Properties.TryGetValue(parentTableAlias.Last(), out var navProp) == false) continue; - var joinAttr = navProp.GetCustomAttribute(); - if (joinAttr == null) continue; - e.Tables[a].NavigateCondition = joinAttr.Condition - .Replace("a.", e.Tables[a].Alias + ".") - .Replace("b.", parentTable.Alias + "."); - } - }; - var joinsql1 = fsql.Select() - .Include(a => a.Parent.Parent) - .Where(a => a.Parent.Parent.code == "001") - .Where(a => a.JoinTest01Enum == JoinTest01Enum.f3.ToString()) - .Where(a => object.Equals(a.JoinTest01Enum, JoinTest01Enum.f3)) - .Where(a => new[] { JoinTest01Enum.f2, JoinTest01Enum.f3 }.Contains(a.JoinTest01Enum2)) - .ToSql(); + fsql.Aop.ConfigEntity += (_, e) => diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 26522f106..537315e21 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -800,14 +800,5 @@ - - - 批量注入 Repository,可以参考代码自行调整 - - - - - - diff --git a/FreeSql.sln b/FreeSql.sln index ed7da68e4..a15fde803 100644 --- a/FreeSql.sln +++ b/FreeSql.sln @@ -119,6 +119,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Tests.Provider.Cust EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Provider.QuestDb", "Providers\FreeSql.Provider.QuestDb\FreeSql.Provider.QuestDb.csproj", "{8A06B18A-A8BF-4AEA-AFE4-0F573C2DBFEE}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Extensions.AggregateRoot", "Extensions\FreeSql.Extensions.AggregateRoot\FreeSql.Extensions.AggregateRoot.csproj", "{71A6F937-D11B-4AE4-9933-BB6B4D925665}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -705,6 +707,18 @@ Global {8A06B18A-A8BF-4AEA-AFE4-0F573C2DBFEE}.Release|x64.Build.0 = Release|Any CPU {8A06B18A-A8BF-4AEA-AFE4-0F573C2DBFEE}.Release|x86.ActiveCfg = Release|Any CPU {8A06B18A-A8BF-4AEA-AFE4-0F573C2DBFEE}.Release|x86.Build.0 = Release|Any CPU + {71A6F937-D11B-4AE4-9933-BB6B4D925665}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {71A6F937-D11B-4AE4-9933-BB6B4D925665}.Debug|Any CPU.Build.0 = Debug|Any CPU + {71A6F937-D11B-4AE4-9933-BB6B4D925665}.Debug|x64.ActiveCfg = Debug|Any CPU + {71A6F937-D11B-4AE4-9933-BB6B4D925665}.Debug|x64.Build.0 = Debug|Any CPU + {71A6F937-D11B-4AE4-9933-BB6B4D925665}.Debug|x86.ActiveCfg = Debug|Any CPU + {71A6F937-D11B-4AE4-9933-BB6B4D925665}.Debug|x86.Build.0 = Debug|Any CPU + {71A6F937-D11B-4AE4-9933-BB6B4D925665}.Release|Any CPU.ActiveCfg = Release|Any CPU + {71A6F937-D11B-4AE4-9933-BB6B4D925665}.Release|Any CPU.Build.0 = Release|Any CPU + {71A6F937-D11B-4AE4-9933-BB6B4D925665}.Release|x64.ActiveCfg = Release|Any CPU + {71A6F937-D11B-4AE4-9933-BB6B4D925665}.Release|x64.Build.0 = Release|Any CPU + {71A6F937-D11B-4AE4-9933-BB6B4D925665}.Release|x86.ActiveCfg = Release|Any CPU + {71A6F937-D11B-4AE4-9933-BB6B4D925665}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -743,10 +757,11 @@ Global {D4FEE5C1-6805-4B46-B10B-BE5CC942B883} = {2A381C57-2697-427B-9F10-55DA11FD02E4} {ECF7FC70-A7FC-4FC3-9BF7-462EA0A65F9C} = {2A381C57-2697-427B-9F10-55DA11FD02E4} {8A06B18A-A8BF-4AEA-AFE4-0F573C2DBFEE} = {2A381C57-2697-427B-9F10-55DA11FD02E4} + {71A6F937-D11B-4AE4-9933-BB6B4D925665} = {4A92E8A6-9A6D-41A1-9CDA-DE10899648AA} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {089687FD-5D25-40AB-BA8A-A10D1E137F98} - RESX_PrefixTranslations = True RESX_NeutralResourcesLanguage = en-US + RESX_PrefixTranslations = True + SolutionGuid = {089687FD-5D25-40AB-BA8A-A10D1E137F98} EndGlobalSection EndGlobal diff --git a/FreeSql/Internal/CommonExpression.cs b/FreeSql/Internal/CommonExpression.cs index d9f6f586d..fd22094b4 100644 --- a/FreeSql/Internal/CommonExpression.cs +++ b/FreeSql/Internal/CommonExpression.cs @@ -2514,7 +2514,8 @@ namespace FreeSql.Internal { if (tb == null || dtoProp == null || tb.Parameter == null) return null; var retList = new List(); - LocalMatch(tb.Parameter.Type, tb.Parameter); + var retExp = LocalMatch(tb.Parameter.Type, tb.Parameter); + if (retList.Any() == false) retList.Add(new[] { retExp }); return retList; Expression LocalMatch(Type type, Expression memExp) diff --git a/FreeSql/Internal/UtilsExpressionTree.cs b/FreeSql/Internal/UtilsExpressionTree.cs index cdc507599..564e836e9 100644 --- a/FreeSql/Internal/UtilsExpressionTree.cs +++ b/FreeSql/Internal/UtilsExpressionTree.cs @@ -632,7 +632,7 @@ namespace FreeSql.Internal var propTypeIsObservableCollection = propElementType != null && pnv.PropertyType == typeof(ObservableCollection<>).MakeGenericType(propElementType); #region islazy - void LocalManyLazyLoadingCode(PropertyInfo refprop, string cscodeExtLogic1, string cscodeExtLogic2, string lmbdWhere) + void LocalOneToManyLazyLoadingCode(PropertyInfo refprop, string cscodeExtLogic1, string cscodeExtLogic2, string lmbdWhere) { cscode.Append(" private bool __lazy__").Append(pnv.Name).AppendLine(" = false;") .Append(" ").Append(propModification).Append(" override ").Append(propTypeName).Append(" ").Append(pnv.Name).AppendLine(" {"); @@ -768,7 +768,7 @@ namespace FreeSql.Internal nvref.RefType = TableRefType.OneToMany; trytb.AddOrUpdateTableRef(pnv.Name, nvref); } - if (isLazy) LocalManyLazyLoadingCode(null, null, null, lmbdWhere.ToString()); + if (isLazy) LocalOneToManyLazyLoadingCode(null, null, null, lmbdWhere.ToString()); } else { @@ -802,6 +802,7 @@ namespace FreeSql.Internal } if (isLazy) LocalLazyLoadingCode(lmbdWhere.ToString()); } + return; } #endregion @@ -1401,7 +1402,7 @@ namespace FreeSql.Internal } } - if (isLazy) LocalManyLazyLoadingCode(refprop, cscodeExtLogic1, cscodeExtLogic2, lmbdWhere.ToString()); + if (isLazy) LocalOneToManyLazyLoadingCode(refprop, cscodeExtLogic1, cscodeExtLogic2, lmbdWhere.ToString()); } } else