Pārlūkot izejas kodu

!1449 sqlsugar扩展,批量in查询需求可以用临时表连表查询
Merge pull request !1449 from Hans/N/A

zuohuaijun 1 gadu atpakaļ
vecāks
revīzija
4dac9111a2

+ 47 - 0
Admin.NET/Admin.NET.Core/Extension/RepositoryExtension.cs

@@ -405,4 +405,51 @@ public static class RepositoryExtension
         }
         return updateable;
     }
+    /// <summary>
+    /// 批量列表in查询
+    /// </summary>
+    /// <typeparam name="T1"></typeparam>
+    /// <typeparam name="T2"></typeparam>
+    /// <param name="queryable"></param>
+    /// <param name="exp"></param>
+    /// <param name="queryList"></param>
+    /// <param name="stoppingToken"></param>
+    /// <returns></returns>
+    public static async Task<List<T1>> BulkListQuery<T1, T2>(this ISugarQueryable<T1> queryable,
+            Expression<Func<T1, SingleColumnEntity<T2>, bool>> exp,
+
+            IEnumerable<T2> queryList,
+            CancellationToken stoppingToken) where T1 : class, new()
+    {
+        // 创建临时表 (用真表兼容性好,表名随机)
+        var tableName = "Temp" + SnowFlakeSingle.Instance.NextId();
+        try
+        {
+            var type = queryable.Context.DynamicBuilder().CreateClass(tableName, new SugarTable())
+                .CreateProperty("ColumnName", typeof(string), new SugarColumn() { IsPrimaryKey = true })//主键不要自增 
+                .BuilderType();
+            // 创建表
+            queryable.Context.CodeFirst.InitTables(type);
+            var insertData = queryList.Select(it => new SingleColumnEntity<T2>() { ColumnName = it }).ToList();
+            // 插入临时表
+            queryable.Context.Fastest<SingleColumnEntity<T2>>()
+                .AS(tableName)
+                .BulkCopy(insertData);
+            var queryTemp = queryable.Context.Queryable<SingleColumnEntity<T2>>()
+                .AS(tableName);
+
+            var systemData = await queryable
+                .InnerJoin(queryTemp, exp)
+                .ToListAsync(stoppingToken);
+
+            queryable.Context.DbMaintenance.DropTable(tableName);
+            return systemData;
+        }
+        catch (Exception error)
+        {
+            queryable.Context.DbMaintenance.DropTable(tableName);
+            throw Oops.Oh(error);
+        }
+
+    }
 }