gpt4 book ai didi

entity-framework - DotNetCore Entity Framework |通用分页

转载 作者:行者123 更新时间:2023-12-04 07:23:27 26 4
gpt4 key购买 nike

我一直在寻找一种在 Dotnet Core 1.1 中使用 Entity Framework 进行通用分页的方法。

我在 MSDN 上找到了这个指南:https://docs.microsoft.com/en-us/aspnet/mvc/overview/getting-started/getting-started-with-ef-using-mvc/sorting-filtering-and-paging-with-the-entity-framework-in-an-asp-net-mvc-application

但这不是通用的,不允许我重用代码。

如果有人正在研究这个,我使用的答案包括在内,我认为分享会很高兴。

它在模型上使用自定义属性,并返回一个分页模型。

最佳答案

编辑:

由于 orderBy 未正确转换为 L2E,因此以下答案不正确。所有记录都将在内存中检索和排序,这会导致性能不佳。查看评论以获取更多信息和可能的解决方案。

原文:

我的解决方案:

模型.cs:

public class User
{

// Sorting is not allowed on Id
public string Id { get; set; }

[Sortable(OrderBy = "FirstName")]
public string FirstName { get; set; }

}

SortableAttribute.cs:
public class SortableAttribute : Attribute
{
public string OrderBy { get; set; }
}

分页服务.cs:
public static class PaginationService
{

public static async Task<Pagination<T>> GetPagination<T>(IQueryable<T> query, int page, string orderBy, bool orderByDesc, int pageSize) where T : class
{
Pagination<T> pagination = new Pagination<T>
{
TotalItems = query.Count(),
PageSize = pageSize,
CurrentPage = page,
OrderBy = orderBy,
OrderByDesc = orderByDesc
};

int skip = (page - 1) * pageSize;
var props = typeof(T).GetProperties();
var orderByProperty = props.FirstOrDefault(n => n.GetCustomAttribute<SortableAttribute>()?.OrderBy == orderBy);


if (orderByProperty == null)
{
throw new Exception($"Field: '{orderBy}' is not sortable");
}

if (orderByDesc)
{
pagination.Result = await query
.OrderByDescending(x => orderByProperty.GetValue(x))
.Skip(skip)
.Take(pageSize)
.ToListAsync();

return pagination;
}
pagination.Result = await query
.OrderBy(x => orderByProperty.GetValue(x))
.Skip(skip)
.Take(pageSize)
.ToListAsync();

return pagination;
}
}

Pagination.cs(模型):
public class Pagination<T>
{
public int CurrentPage { get; set; }

public int PageSize { get; set; }

public int TotalPages { get; set; }

public int TotalItems { get; set; }

public string OrderBy { get; set; }

public bool OrderByDesc { get; set; }

public List<T> Result { get; set; }
}

UserController.cs( Controller 内部),上下文是EntityFramework上下文:
 [HttpGet]
public async Task<IActionResult> GetUsers([FromQuery] string orderBy, [FromQuery] bool orderByDesc, [FromQuery] int page, [FromQuery] int size)
{
var query = _context.User.AsQueryable();
try
{
var list = await PaginationService.GetPagination(query, page, orderBy, orderByDesc, size);
return new JsonResult(list);
}
catch (Exception e)
{
return new BadRequestObjectResult(e.Message);
}
}

我希望这对 future 的人有所帮助!

关于entity-framework - DotNetCore Entity Framework |通用分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45691612/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com