Files
jinko.yikatong/Src/Dlhis.ScheduledTask/DeviceUploadLog/DoubleSearchStore.cs
2025-06-06 16:08:06 +08:00

137 lines
4.7 KiB
C#

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<List<T>> GetResultAsync<T>(this IDbContext dbContext,
List<string> tables,
Expression<Func<T, bool>> where,
int pageIndex, int pageSize) where T : DeviceUploadLogEntity
{
var searchOffset = (pageIndex - 1) * pageSize;
var currentOffset = (pageIndex - 1) * pageSize / tables.Count;
var listResult = new List<TempResult<T>>(tables.Count);
foreach (var table in tables)
{
var r = await dbContext.Queryable<T>().AS(table)
.WhereIF(where != null, where)
.OrderBy(x => x.RaiseDateTime)
.Skip(currentOffset).Take(pageSize)
.ToListAsync();
listResult.Add(new TempResult<T>
{
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<T>().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<T>
{
public string Table { get; set; }
public List<T> Result { get; set; }
public DateTime Min { get; set; }
public DateTime Max { get; set; }
}
}
// public static class DoubleSearchStore
// {
// public static async Task<List<T>> GetResultAsync<T>(this IDbContext dbContext,
// List<string> tables,
// Expression<Func<T, bool>> where,
// int pageIndex, int pageSize) where T : TestDataEntity
// {
// var searchOffset = (pageIndex - 1) * pageSize;
// var currentOffset = (pageIndex - 1) * pageSize / tables.Count;
//
// var listResult = new List<TempResult<T>>(tables.Count);
// foreach (var table in tables)
// {
// var r = await dbContext.Queryable<T>().AS(table)
// .WhereIF(where != null, where)
// .OrderBy(x => x.Timestamp)
// .Skip(currentOffset).Take(pageSize)
// .ToListAsync();
//
// listResult.Add(new TempResult<T>
// {
// 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<T>().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<T>
// {
// public string Table { get; set; }
// public List<T> Result { get; set; }
// public long Min { get; set; }
// public long Max { get; set; }
// }
// }