diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 5ca74890..2acb6679 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -130,6 +130,13 @@ 清空状态数据 + + + 根据 lambda 条件删除数据 + + + + 添加 @@ -520,5 +527,14 @@ + + + 批量注入 Repository,可以参考代码自行调整 + + + + + + diff --git a/FreeSql.Tests.VB/UnitTest1.vb b/FreeSql.Tests.VB/UnitTest1.vb index d9e12fa3..8551d581 100644 --- a/FreeSql.Tests.VB/UnitTest1.vb +++ b/FreeSql.Tests.VB/UnitTest1.vb @@ -20,20 +20,81 @@ WHERE (a.[Id] = 100 AND a.[Title] IS NULL)", sql) REM VB.net ʽԲ Dim id As Integer = 100 + + Assert.Equal("SELECT a.[Id], a.[Title], a.[IsDeleted], a.[IdNullable] +FROM [Testvb] a +WHERE (a.[Id] = 100)", g.sqlserver.Select(Of Testvb).Where(Function(a) a.Id = 100).ToSql()) Dim List1 = g.sqlserver.Select(Of Testvb).Where(Function(a) a.Id = 100).ToList() + + Assert.Equal("SELECT a.[Id], a.[Title], a.[IsDeleted], a.[IdNullable] +FROM [Testvb] a +WHERE (a.[Id] = 100)", g.sqlserver.Select(Of Testvb).Where(Function(a) a.Id = id).ToSql()) Dim List2 = g.sqlserver.Select(Of Testvb).Where(Function(a) a.Id = id).ToList() + + Assert.Equal("SELECT a.[Id], a.[Title], a.[IsDeleted], a.[IdNullable] +FROM [Testvb] a +WHERE (a.[IdNullable] = 100)", g.sqlserver.Select(Of Testvb).Where(Function(a) a.IdNullable = 100).ToSql()) Dim List11 = g.sqlserver.Select(Of Testvb).Where(Function(a) a.IdNullable = 100).ToList() + + Assert.Equal("SELECT a.[Id], a.[Title], a.[IsDeleted], a.[IdNullable] +FROM [Testvb] a +WHERE (a.[IdNullable] = 100)", g.sqlserver.Select(Of Testvb).Where(Function(a) a.IdNullable = id).ToSql()) Dim List22 = g.sqlserver.Select(Of Testvb).Where(Function(a) a.IdNullable = id).ToList() + Dim idNullable As Integer? = 100 + + Assert.Equal("SELECT a.[Id], a.[Title], a.[IsDeleted], a.[IdNullable] +FROM [Testvb] a +WHERE (a.[IdNullable] = 100)", g.sqlserver.Select(Of Testvb).Where(Function(a) a.IdNullable = idNullable).ToSql()) Dim List222 = g.sqlserver.Select(Of Testvb).Where(Function(a) a.IdNullable = idNullable).ToList() + + Assert.Equal("SELECT a.[Id], a.[Title], a.[IsDeleted], a.[IdNullable] +FROM [Testvb] a +WHERE (a.[Title] = N'xxx')", g.sqlserver.Select(Of Testvb).Where(Function(a) a.Title = "xxx").ToSql()) Dim List3 = g.sqlserver.Select(Of Testvb).Where(Function(a) a.Title = "xxx").ToList() + Dim title As String = "xxx" + + Assert.Equal("SELECT a.[Id], a.[Title], a.[IsDeleted], a.[IdNullable] +FROM [Testvb] a +WHERE (a.[Title] = N'xxx')", g.sqlserver.Select(Of Testvb).Where(Function(a) a.Title = title).ToSql()) Dim List4 = g.sqlserver.Select(Of Testvb).Where(Function(a) a.Title = title).ToList() + + Assert.Equal("SELECT a.[Id], a.[Title], a.[IsDeleted], a.[IdNullable] +FROM [Testvb] a +WHERE (a.[Title] <> N'xxx')", g.sqlserver.Select(Of Testvb).Where(Function(a) a.Title <> "xxx").ToSql()) Dim List5 = g.sqlserver.Select(Of Testvb).Where(Function(a) a.Title <> "xxx").ToList() + + Assert.Equal("SELECT a.[Id], a.[Title], a.[IsDeleted], a.[IdNullable] +FROM [Testvb] a +WHERE (a.[Title] <> N'xxx')", g.sqlserver.Select(Of Testvb).Where(Function(a) a.Title <> title).ToSql()) Dim List6 = g.sqlserver.Select(Of Testvb).Where(Function(a) a.Title <> title).ToList() - Dim List7 = g.sqlserver.Select(Of Testvb).ToList(Function(a) New With {a, a.Id, a.Title}) - Dim List8 = g.sqlserver.Select(Of Testvb).Where(Function(a) a.IsDeleted).ToList() + Assert.Equal("SELECT a.[Id], a.[Title], a.[IsDeleted], a.[IdNullable] +FROM [Testvb] a +WHERE (a.[Title] = a.[Title])", g.sqlserver.Select(Of Testvb).Where(Function(a) a.Title = a.Title).ToSql()) + Dim List7 = g.sqlserver.Select(Of Testvb).Where(Function(a) a.Title = a.Title).ToList() + + Assert.Equal("SELECT a.[Id], a.[Title], a.[IsDeleted], a.[IdNullable] +FROM [Testvb] a +WHERE (a.[Title] <> a.[Title])", g.sqlserver.Select(Of Testvb).Where(Function(a) a.Title <> a.Title).ToSql()) + Dim List71 = g.sqlserver.Select(Of Testvb).Where(Function(a) a.Title = a.Title).ToList() + + Assert.Equal("SELECT a.[Id] as1, a.[Title] as2, a.[IsDeleted] as3, a.[IdNullable] as4, a.[Id] as5, a.[Title] as6 +FROM [Testvb] a", g.sqlserver.Select(Of Testvb).ToSql(Function(a) New With {a, a.Id, a.Title})) + Dim List8 = g.sqlserver.Select(Of Testvb).ToList(Function(a) New With {a, a.Id, a.Title}) + + Assert.Equal("SELECT a.[Id] as1, a.[Title] as2 +FROM [Testvb] a", g.sqlserver.Select(Of Testvb).ToSql(Function(a) New With {a.Id, a.Title})) + Dim List81 = g.sqlserver.Select(Of Testvb).ToList(Function(a) New With {a.Id, a.Title}) + + Assert.Equal("SELECT a.[Id], a.[Title], a.[IsDeleted], a.[IdNullable] +FROM [Testvb] a +WHERE (a.[IsDeleted] = 1)", g.sqlserver.Select(Of Testvb).Where(Function(a) a.IsDeleted).ToSql()) + Dim List9 = g.sqlserver.Select(Of Testvb).Where(Function(a) a.IsDeleted).ToList() + + REM Microsoft.VisualBasic.CompilerServices.Operators.CompareObjectEqual( + g.sqlserver.Delete(Of Testvb2).Where("1=1").ExecuteAffrows() @@ -48,7 +109,7 @@ WHERE (a.[Id] = 100 AND a.[Title] IS NULL)", sql) g.sqlserver.Insert(New Testvb2 With {.Id = 5, .TestvbId = 2, .Context = "Context22"}).ExecuteAffrows() g.sqlserver.Insert(New Testvb2 With {.Id = 6, .TestvbId = 3, .Context = "Context31"}).ExecuteAffrows() - Dim List9 = g.sqlserver.Select(Of Testvb).IncludeMany(Function(a) a.Testvb2s).ToList() + Dim List10 = g.sqlserver.Select(Of Testvb).IncludeMany(Function(a) a.Testvb2s).ToList() BaseEntity.Initialization(g.sqlserver, Nothing) Dim cowR As CowRecord = New CowRecord diff --git a/FreeSql/Extensions/FreeSqlGlobalExtensions.cs b/FreeSql/Extensions/FreeSqlGlobalExtensions.cs index 4cf89817..416646bc 100644 --- a/FreeSql/Extensions/FreeSqlGlobalExtensions.cs +++ b/FreeSql/Extensions/FreeSqlGlobalExtensions.cs @@ -44,7 +44,7 @@ public static partial class FreeSqlGlobalExtensions public static bool IsIntegerType(this Type that) => that == null ? false : (_dicIsNumberType.Value.TryGetValue(that, out var tryval) ? tryval : false); public static bool IsNumberType(this Type that) => that == null ? false : _dicIsNumberType.Value.ContainsKey(that); public static bool IsNullableType(this Type that) => that.IsArray == false && that?.FullName.StartsWith("System.Nullable`1[") == true; - public static bool IsAnonymousType(this Type that) => that?.FullName.StartsWith("<>f__AnonymousType") == true; + public static bool IsAnonymousType(this Type that) => that == null ? false : (that.FullName.StartsWith("<>f__AnonymousType") || that.FullName.StartsWith("VB$AnonymousType")); public static bool IsArrayOrList(this Type that) => that == null ? false : (that.IsArray || typeof(IList).IsAssignableFrom(that)); public static Type NullableTypeOrThis(this Type that) => that?.IsNullableType() == true ? that.GetGenericArguments().First() : that; internal static string NotNullAndConcat(this string that, params object[] args) => string.IsNullOrEmpty(that) ? null : string.Concat(new object[] { that }.Concat(args)); diff --git a/FreeSql/Internal/CommonExpression.cs b/FreeSql/Internal/CommonExpression.cs index fe9e51ab..f2d1512a 100644 --- a/FreeSql/Internal/CommonExpression.cs +++ b/FreeSql/Internal/CommonExpression.cs @@ -465,20 +465,6 @@ namespace FreeSql.Internal } public string ExpressionBinary(string oper, Expression leftExp, Expression rightExp, ExpTSC tsc) { - if (leftExp.NodeType == ExpressionType.Call && - rightExp.NodeType == ExpressionType.Constant && - new[] { "=", "<>" }.Contains(oper)) - { - var leftExpCall = leftExp as MethodCallExpression; - //vb 语法,将字符串比较转换为了 CompareString - if (leftExpCall.Method.Name == "CompareString" && - leftExpCall.Method.DeclaringType?.FullName == "Microsoft.VisualBasic.CompilerServices.Operators" && - leftExpCall.Arguments.Count == 3 && - leftExpCall.Arguments[2].Type == typeof(bool) && - rightExp.Type == typeof(int) && - (int)(rightExp as ConstantExpression).Value == 0) - return ExpressionBinary(oper, leftExpCall.Arguments[0], leftExpCall.Arguments[1], tsc); - } switch (oper) { case "OR": @@ -498,6 +484,19 @@ namespace FreeSql.Internal return $"({ExpressionLambdaToSql(leftExp, tsc)} {oper} {ExpressionLambdaToSql(rightExp, tsc)})"; case "=": case "<>": + if (leftExp.NodeType == ExpressionType.Call && + rightExp.NodeType == ExpressionType.Constant) + { + var leftExpCall = leftExp as MethodCallExpression; + //vb 语法,将字符串比较转换为了 CompareString + if (leftExpCall.Method.Name == "CompareString" && + leftExpCall.Method.DeclaringType?.FullName == "Microsoft.VisualBasic.CompilerServices.Operators" && + leftExpCall.Arguments.Count == 3 && + leftExpCall.Arguments[2].Type == typeof(bool) && + rightExp.Type == typeof(int) && + (int)(rightExp as ConstantExpression).Value == 0) + return ExpressionBinary(oper, leftExpCall.Arguments[0], leftExpCall.Arguments[1], tsc); + } var exptb = _common.GetTableByEntity(leftExp.Type); if (exptb?.Properties.Any() == true) leftExp = Expression.MakeMemberAccess(leftExp, exptb.Properties[(exptb.Primarys.FirstOrDefault() ?? exptb.Columns.FirstOrDefault().Value)?.CsName]); exptb = _common.GetTableByEntity(leftExp.Type);