diff --git a/Examples/base_entity/Program.cs b/Examples/base_entity/Program.cs index 1cc4c9fe..54fbbee9 100644 --- a/Examples/base_entity/Program.cs +++ b/Examples/base_entity/Program.cs @@ -351,6 +351,21 @@ 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; } + public string code { get; set; } + public string parentcode { get; set; } + public string name { get; set; } + + [JoinCondition("a.parentcode = b.code")] + public JoinTest01 Parent { get; set; } + } static void Main(string[] args) { @@ -409,6 +424,52 @@ namespace base_entity BaseEntity.Initialization(fsql, () => _asyncUow.Value); #endregion + 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; + 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 + "."); + } + e.Result = result; + }; + var joinsql1 = fsql.Select() + .Include(a => a.Parent.Parent) + .Where(a => a.Parent.Parent.code == "001") + .ToSql(); + + fsql.Aop.ConfigEntity += (_, e) => { Console.WriteLine("Aop.ConfigEntity: " + e.ModifyResult.Name); diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 594fbad3..26522f10 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -733,6 +733,15 @@ + + + 根据Assembly扫描所有继承IEntityTypeConfiguration<T>的配置类 + + + + + + 创建普通数据上下文档对象 @@ -791,5 +800,14 @@ + + + 批量注入 Repository,可以参考代码自行调整 + + + + + + diff --git a/FreeSql/Internal/CommonProvider/UpdateProvider.cs b/FreeSql/Internal/CommonProvider/UpdateProvider.cs index 8678f0bb..6f82de5b 100644 --- a/FreeSql/Internal/CommonProvider/UpdateProvider.cs +++ b/FreeSql/Internal/CommonProvider/UpdateProvider.cs @@ -6,7 +6,6 @@ using System.Data; using System.Data.Common; using System.Linq; using System.Linq.Expressions; -using System.Reflection; using System.Text; using System.Threading.Tasks; @@ -1017,9 +1016,15 @@ namespace FreeSql.Internal.CommonProvider if (_source.Any() == false) { + var sbString = ""; foreach (var col in _table.Columns.Values) if (col.Attribute.CanUpdate && string.IsNullOrEmpty(col.DbUpdateValue) == false) - sb.Append(", ").Append(_commonUtils.QuoteSqlName(col.Attribute.Name)).Append(" = ").Append(col.DbUpdateValue); + { + if (sbString == "") sbString = sb.ToString(); + var loc3 = _commonUtils.QuoteSqlName(col.Attribute.Name); + if (sbString.Contains(loc3)) continue; + sb.Append(", ").Append(loc3).Append(" = ").Append(col.DbUpdateValue); + } } if (_versionColumn != null) diff --git a/Providers/FreeSql.Provider.ClickHouse/Curd/ClickHouseUpdate.cs b/Providers/FreeSql.Provider.ClickHouse/Curd/ClickHouseUpdate.cs index 332ac7c9..1faf9321 100644 --- a/Providers/FreeSql.Provider.ClickHouse/Curd/ClickHouseUpdate.cs +++ b/Providers/FreeSql.Provider.ClickHouse/Curd/ClickHouseUpdate.cs @@ -193,9 +193,15 @@ namespace FreeSql.ClickHouse.Curd if (_source.Any() == false) { + var sbString = ""; foreach (var col in _table.Columns.Values) if (col.Attribute.CanUpdate && string.IsNullOrEmpty(col.DbUpdateValue) == false) - sb.Append(", ").Append(_commonUtils.QuoteSqlName(col.Attribute.Name)).Append(" = ").Append(col.DbUpdateValue); + { + if (sbString == "") sbString = sb.ToString(); + var loc3 = _commonUtils.QuoteSqlName(col.Attribute.Name); + if (sbString.Contains(loc3)) continue; + sb.Append(", ").Append(loc3).Append(" = ").Append(col.DbUpdateValue); + } } if (_table.VersionColumn != null)