using System.Linq.Expressions; using Dlhis.Entity.Device.Entities; using Kurisu.AspNetCore.DataAccess.SqlSugar.Services; namespace Dlhis.ScheduledTask.DeviceUploadLog; public static class DoubleSearchStore { public static async Task> GetResultAsync(this IDbContext dbContext, List tables, Expression> where, int pageIndex, int pageSize) where T : DeviceUploadLogEntity { var searchOffset = (pageIndex - 1) * pageSize; var currentOffset = (pageIndex - 1) * pageSize / tables.Count; var listResult = new List>(tables.Count); foreach (var table in tables) { var r = await dbContext.Queryable().AS(table) .WhereIF(where != null, where) .OrderBy(x => x.RaiseDateTime) .Skip(currentOffset).Take(pageSize) .ToListAsync(); listResult.Add(new TempResult { Table = table, Result = r, Min = r.Min(x => x.RaiseDateTime), Max = r.Max(x => x.RaiseDateTime) }); } var currentMin = listResult.Min(x => x.Min); var currentMax = listResult.Max(x => x.Max); var resultOffset = 0; foreach (var item in listResult) { var r = await dbContext.Queryable().AS(item.Table) .WhereIF(where != null, where) .Where(x => x.RaiseDateTime >= currentMin && x.RaiseDateTime <= currentMax) .OrderBy(x => x.RaiseDateTime) .ToListAsync(); var ct = r.Min(x => x.RaiseDateTime); if (ct == currentMin) { resultOffset += currentOffset; } else { var count = r.Count(x => x.RaiseDateTime > currentMin && x.RaiseDateTime <= item.Min); resultOffset += currentOffset - count; } item.Result = r; } var result = listResult.SelectMany(x => x.Result).OrderBy(x => x.RaiseDateTime).ToList(); return result.Skip(searchOffset - (resultOffset + 1)).Take(pageSize).ToList(); } public class TempResult { public string Table { get; set; } public List Result { get; set; } public DateTime Min { get; set; } public DateTime Max { get; set; } } } // public static class DoubleSearchStore // { // public static async Task> GetResultAsync(this IDbContext dbContext, // List tables, // Expression> where, // int pageIndex, int pageSize) where T : TestDataEntity // { // var searchOffset = (pageIndex - 1) * pageSize; // var currentOffset = (pageIndex - 1) * pageSize / tables.Count; // // var listResult = new List>(tables.Count); // foreach (var table in tables) // { // var r = await dbContext.Queryable().AS(table) // .WhereIF(where != null, where) // .OrderBy(x => x.Timestamp) // .Skip(currentOffset).Take(pageSize) // .ToListAsync(); // // listResult.Add(new TempResult // { // Table = table, // Result = r, // Min = r.Min(x => x.Timestamp), // Max = r.Max(x => x.Timestamp) // }); // } // // var currentMin = listResult.Min(x => x.Min); // var currentMax = listResult.Max(x => x.Max); // var resultOffset = 0; // foreach (var item in listResult) // { // var r = await dbContext.Queryable().AS(item.Table) // .WhereIF(where != null, where) // .Where(x => x.Timestamp >= currentMin && x.Timestamp <= currentMax) // .OrderBy(x => x.Timestamp) // .ToListAsync(); // // var ct = r.Min(x => x.Timestamp); // if (ct == currentMin) // { // resultOffset += currentOffset; // } // else // { // var count = r.Count(x => x.Timestamp > currentMin && x.Timestamp <= item.Min); // resultOffset += currentOffset - count; // } // // item.Result = r; // } // // var result = listResult.SelectMany(x => x.Result).OrderBy(x => x.Timestamp).ToList(); // return result.Skip(searchOffset - (resultOffset + 1)).Take(pageSize).ToList(); // } // // public class TempResult // { // public string Table { get; set; } // public List Result { get; set; } // public long Min { get; set; } // public long Max { get; set; } // } // }