137 lines
4.7 KiB
C#
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; }
|
|
// }
|
|
// } |