- 优化 IUpdate ToSql;

This commit is contained in:
2881099 2022-06-30 13:54:51 +08:00
parent 3f77ea3a63
commit 0e82d6c3e3
7 changed files with 306 additions and 284 deletions

View File

@ -800,14 +800,5 @@
<param name="that"></param> <param name="that"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:Microsoft.Extensions.DependencyInjection.FreeSqlRepositoryDependencyInjection.AddFreeRepository(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Action{FreeSql.FluentDataFilter},System.Reflection.Assembly[])">
<summary>
批量注入 Repository可以参考代码自行调整
</summary>
<param name="services"></param>
<param name="globalDataFilter"></param>
<param name="assemblies"></param>
<returns></returns>
</member>
</members> </members>
</doc> </doc>

View File

@ -1,6 +1,8 @@
using FreeSql.DataAnnotations; using FreeSql.DataAnnotations;
using Newtonsoft.Json.Linq;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Xunit; using Xunit;
@ -12,7 +14,19 @@ namespace FreeSql.Tests
[Fact] [Fact]
public void DeleteCascade() public void DeleteCascade()
{ {
var fsql = g.sqlite; using (var fsql = new FreeSqlBuilder()
.UseConnectionString(DataType.Sqlite, "data source=:memory:")
.UseAutoSyncStructure(true)
.UseNoneCommandParameter(true)
.UseMonitorCommand(cmd => Trace.WriteLine(cmd.CommandText))
.Build())
{
fsql.CodeFirst.GetTableByEntity(typeof(DeleteCascadeUserGroup)).ColumnsByCs
.Where(a => !new[] { typeof(string), typeof(int), typeof(DateTime), typeof(long) }.Contains(a.Value.Attribute.MapType))
.ToArray();
fsql.GlobalFilter.Apply<DeleteCascadeUserGroup>("soft_delete", a => a.IsDeleted == false);
fsql.Delete<DeleteCascadeUserGroup>().Where("1=1").ExecuteAffrows(); fsql.Delete<DeleteCascadeUserGroup>().Where("1=1").ExecuteAffrows();
fsql.Delete<DeleteCascadeUserExt>().Where("1=1").ExecuteAffrows(); fsql.Delete<DeleteCascadeUserExt>().Where("1=1").ExecuteAffrows();
fsql.Delete<DeleteCascadeUser>().Where("1=1").ExecuteAffrows(); fsql.Delete<DeleteCascadeUser>().Where("1=1").ExecuteAffrows();
@ -27,6 +41,10 @@ namespace FreeSql.Tests
userRepo.DbContextOptions.EnableCascadeSave = true; userRepo.DbContextOptions.EnableCascadeSave = true;
userextRepo.DbContextOptions.EnableCascadeSave = true; userextRepo.DbContextOptions.EnableCascadeSave = true;
tagRepo.DbContextOptions.EnableCascadeSave = true; tagRepo.DbContextOptions.EnableCascadeSave = true;
groupRepo.DbContextOptions.EnableGlobalFilter = false;
userRepo.DbContextOptions.EnableGlobalFilter = false;
userextRepo.DbContextOptions.EnableGlobalFilter = false;
tagRepo.DbContextOptions.EnableGlobalFilter = false;
//OneToOne InDatabase //OneToOne InDatabase
fsql.Delete<DeleteCascadeUser>().Where("1=1").ExecuteAffrows(); fsql.Delete<DeleteCascadeUser>().Where("1=1").ExecuteAffrows();
@ -332,6 +350,7 @@ namespace FreeSql.Tests
Assert.False(userextRepo.Select.Any()); Assert.False(userextRepo.Select.Any());
Assert.False(fsql.Select<DeleteCascadeUserTag>().Any()); Assert.False(fsql.Select<DeleteCascadeUserTag>().Any());
} }
}
public class DeleteCascadeUser public class DeleteCascadeUser
{ {
[Column(IsIdentity = true)] [Column(IsIdentity = true)]
@ -339,6 +358,7 @@ namespace FreeSql.Tests
public string Username { get; set; } public string Username { get; set; }
public string Password { get; set; } public string Password { get; set; }
public int GroupId { get; set; } public int GroupId { get; set; }
public bool IsDeleted { get; set; }
[Navigate(nameof(Id))] [Navigate(nameof(Id))]
public DeleteCascadeUserExt UserExt { get; set; } public DeleteCascadeUserExt UserExt { get; set; }
@ -350,6 +370,7 @@ namespace FreeSql.Tests
[Column(IsPrimary = true)] [Column(IsPrimary = true)]
public int UserId { get; set; } public int UserId { get; set; }
public string Remark { get; set; } public string Remark { get; set; }
public bool IsDeleted { get; set; }
[Navigate(nameof(UserId))] [Navigate(nameof(UserId))]
public DeleteCascadeUser User { get; set; } public DeleteCascadeUser User { get; set; }
@ -359,6 +380,7 @@ namespace FreeSql.Tests
[Column(IsIdentity = true)] [Column(IsIdentity = true)]
public int Id { get; set; } public int Id { get; set; }
public string GroupName { get; set; } public string GroupName { get; set; }
public bool IsDeleted { get; set; }
[Navigate(nameof(DeleteCascadeUser.GroupId))] [Navigate(nameof(DeleteCascadeUser.GroupId))]
public List<DeleteCascadeUser> Users { get; set; } public List<DeleteCascadeUser> Users { get; set; }
@ -368,6 +390,7 @@ namespace FreeSql.Tests
[Column(IsIdentity = true)] [Column(IsIdentity = true)]
public int Id { get; set; } public int Id { get; set; }
public string TagName { get; set; } public string TagName { get; set; }
public bool IsDeleted { get; set; }
[Navigate(ManyToMany = typeof(DeleteCascadeUserTag))] [Navigate(ManyToMany = typeof(DeleteCascadeUserTag))]
public List<DeleteCascadeUser> Users { get; set; } public List<DeleteCascadeUser> Users { get; set; }
@ -376,6 +399,7 @@ namespace FreeSql.Tests
{ {
public int UserId { get; set; } public int UserId { get; set; }
public int TagId { get; set; } public int TagId { get; set; }
public bool IsDeleted { get; set; }
[Navigate(nameof(UserId))] [Navigate(nameof(UserId))]
public DeleteCascadeUser User { get; set; } public DeleteCascadeUser User { get; set; }

View File

@ -1,4 +1,4 @@
using FreeSql.DataAnnotations; using FreeSql.DataAnnotations;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@ -174,6 +174,9 @@ namespace FreeSql.Tests.Sqlite
sql = update.Set(a => a.Clicks == null).Where(a => a.Id == 1).ToSql().Replace("\r\n", ""); sql = update.Set(a => a.Clicks == null).Where(a => a.Id == 1).ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE \"tb_topic\" SET \"Clicks\" = NULL WHERE (\"Id\" = 1)", sql); Assert.Equal("UPDATE \"tb_topic\" SET \"Clicks\" = NULL WHERE (\"Id\" = 1)", sql);
sql = update.SetIf(false, a => a.Clicks == null).Where(a => a.Id == 1).ToSql()?.Replace("\r\n", "");
Assert.Null(sql);
} }
[Fact] [Fact]
public void SetRaw() public void SetRaw()

View File

@ -177,6 +177,7 @@ namespace FreeSql.Internal.CommonProvider
sb.Append(sql).Append("\r\n\r\n;\r\n\r\n"); sb.Append(sql).Append("\r\n\r\n;\r\n\r\n");
}); });
if (sb.Length > 0) sb.Remove(sb.Length - 9, 9); if (sb.Length > 0) sb.Remove(sb.Length - 9, 9);
if (sb.Length == 0) return null;
return sb.ToString(); return sb.ToString();
} }

View File

@ -797,6 +797,7 @@ namespace FreeSql.Internal.CommonProvider
sb2.Append(sql).Append("\r\n\r\n;\r\n\r\n"); sb2.Append(sql).Append("\r\n\r\n;\r\n\r\n");
}); });
if (sb2.Length > 0) sb2.Remove(sb2.Length - 9, 9); if (sb2.Length > 0) sb2.Remove(sb2.Length - 9, 9);
if (sb2.Length == 0) return null;
return sb2.ToString(); return sb2.ToString();
} }
@ -866,6 +867,7 @@ namespace FreeSql.Internal.CommonProvider
public virtual void ToSqlExtension110(StringBuilder sb, bool isAsTableSplited) public virtual void ToSqlExtension110(StringBuilder sb, bool isAsTableSplited)
{ {
if (_where.Length == 0 && _source.Any() == false) return; if (_where.Length == 0 && _source.Any() == false) return;
if (_source.Any() == false && _set.Length == 0 && _setIncr.Length == 0) return;
if (_table.AsTableImpl != null && isAsTableSplited == false && _source == _sourceOld && _source.Any()) if (_table.AsTableImpl != null && isAsTableSplited == false && _source == _sourceOld && _source.Any())
{ {

View File

@ -20,7 +20,7 @@ namespace FreeSql.ClickHouse.Curd
public override string ToSql() public override string ToSql()
{ {
return base.ToSql().Replace("DELETE FROM ", "ALTER TABLE ").Replace(" WHERE ", " DELETE WHERE "); return base.ToSql()?.Replace("DELETE FROM ", "ALTER TABLE ").Replace(" WHERE ", " DELETE WHERE ");
} }
#if net40 #if net40

View File

@ -68,6 +68,7 @@ namespace FreeSql.ClickHouse.Curd
public override void ToSqlExtension110(StringBuilder sb, bool isAsTableSplited) public override void ToSqlExtension110(StringBuilder sb, bool isAsTableSplited)
{ {
if (_where.Length == 0 && _source.Any() == false) return; if (_where.Length == 0 && _source.Any() == false) return;
if (_source.Any() == false && _set.Length == 0 && _setIncr.Length == 0) return;
if (_table.AsTableImpl != null && isAsTableSplited == false && _source == _sourceOld && _source.Any()) if (_table.AsTableImpl != null && isAsTableSplited == false && _source == _sourceOld && _source.Any())
{ {