Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在asp内核中使用sieve进行分页时,如何发送一个请求而不是两个请求?_C#_Entity Framework_Entity Framework Core_Sieve - Fatal编程技术网

C# 在asp内核中使用sieve进行分页时,如何发送一个请求而不是两个请求?

C# 在asp内核中使用sieve进行分页时,如何发送一个请求而不是两个请求?,c#,entity-framework,entity-framework-core,sieve,C#,Entity Framework,Entity Framework Core,Sieve,我编写这个查询的目的是让用户使用分页。我正在使用Sieve进行分页、筛选和排序,但此查询存在问题: 我打算向数据库发送一个请求,然后返回以下数据: public class UserPagingDto { [Sieve(CanFilter = true, CanSort = true)] public Guid Id { get; set; } [Sieve(CanFilter = true, CanSort = true)] public string Use

我编写这个查询的目的是让用户使用分页。我正在使用
Sieve
进行分页、筛选和排序,但此查询存在问题:

我打算向数据库发送一个请求,然后返回以下数据:

 public class UserPagingDto
{
    [Sieve(CanFilter = true, CanSort = true)]
    public Guid Id { get; set; }
    [Sieve(CanFilter = true, CanSort = true)]
    public string Username { get; set; }
    [Sieve(CanFilter = true, CanSort = true)]
    public string DisplayName { get; set; }
    [Sieve(CanFilter = true, CanSort = true)]
    public bool IsActive { get; set; }
    [Sieve(CanFilter = true, CanSort = true)]
    public bool IsLockedEnd { get; set; }
    [Sieve(CanFilter = true, CanSort = true)]
    public bool ConfirmPhoneNumber { get; set; }
    public UserPagingInfo UserInfos { get; set;
    }
}

public class UserPagingInfo
{
    [Sieve(CanFilter = true, CanSort = true)]
    public int AccountFaile { get; set; }
    [Sieve(CanFilter = true, CanSort = true)]
    public bool ConfirmEmail { get; set; }
    [Sieve(CanFilter = true, CanSort = true)]
    public string PhoneNumber { get; set; }
    [Sieve(CanFilter = true, CanSort = true)]
    public DateTimeOffset? LockedEnd { get; set; }
    [Sieve(CanFilter = true, CanSort = true)]
    public string? Email { get; set; }
    [Sieve(CanFilter = true, CanSort = true)]
    public string Name { get; set; }
    [Sieve(CanFilter = true, CanSort = true)]
    public string Family { get; set; }
    [Sieve(CanFilter = true, CanSort = true)]
    public string RoleName { get; set; }
    [Sieve(CanFilter = true, CanSort = true)]
    public Guid RoleId { get; set; }

}
为此,我写了以下内容:

    var user = Users.AsNoTracking().Select(x => new
            {
                Id=x.Id,
                Username = x.Username,
                Name = x.Name,
                Family = x.Family,
                DisplayName = $"{x.Name} {x.Family}",
                Email = x.Email,
                PhoneNumber = x.PhoneNumber,
                AccountFaile = x.AccountFaile,
                IsActive = x.IsActive,
                IsLockedEnd = x.IsLockedEnd,
                ConfirmPhoneNumber = x.ConfirmPhoneNumber,
                ConfirmEmail = x.ConfirmEmail,
                LockedEnd = x.LockedEnd,
                Role = x.UserRoles.Role
            }).Select(c => new UserPagingDto
            {
                Id=c.Id,
                ConfirmPhoneNumber = c.ConfirmPhoneNumber,
                DisplayName = c.DisplayName,
                IsActive = c.IsActive,
                IsLockedEnd = c.IsLockedEnd,
                Username = c.Username,
                UserInfos = new UserPagingInfo
                {
                    AccountFaile = c.AccountFaile,
                    ConfirmEmail = c.ConfirmEmail,
                    Email = c.Email,
                    Family = c.Family,
                    LockedEnd = c.LockedEnd,
                    Name = c.Name,
                    PhoneNumber = c.PhoneNumber,
                    RoleId = c.Role.Id,
                    RoleName = c.Role.Name
                }
            });
            var sieveModel = new SieveModel
            {
                PageSize = formQuery.PageSize,
                Filters = formQuery.Filters,
                Page = formQuery.Page,
                Sorts = formQuery.Sorts
            };
            var result = sieveProcessor.Apply(sieveModel, user);
            return OperationResult<GetAllPaging<UserPagingDto>>.BuildSuccessResult(new GetAllPaging<UserPagingDto>
            {
                Records = result,
                TotalCount = await Users.CountAsync()
            });
第二个查询是这个,我只想发送这个查询:

 SELECT [u].[Id], [u].[ConfirmPhoneNumber], [u].[Name], [u].[Family], [u].[IsActive], [u].[IsLockedEnd], [u].[Username], [u].[AccountFaile], [u].[ConfirmEmail], [u].[Email], [u].[LockedEnd], [u].[PhoneNumber], [t0].[Id], [t0].[Name]
FROM [User] AS [u]
LEFT JOIN (
    SELECT [u0].[Id], [u0].[IsDelete], [u0].[RoleId], [u0].[UserId]
    FROM [UserRole] AS [u0]
    WHERE [u0].[IsDelete] = CAST(0 AS bit)
) AS [t] ON [u].[Id] = [t].[UserId]
LEFT JOIN (
    SELECT [r].[Id], [r].[Description], [r].[IsDelete], [r].[Name], [r].[SecurityStamp]
    FROM [Role] AS [r]
    WHERE [r].[IsDelete] = CAST(0 AS bit)
) AS [t0] ON [t].[RoleId] = [t0].[Id]
WHERE [u].[IsDelete] = CAST(0 AS bit)
ORDER BY [u].[Id]
OFFSET @__p_0 ROWS FETCH NEXT @__p_1 ROWS ONLY

您混淆了查询和集合

这:

不是对象的集合。这是一个疑问。如果将查询传递给运行
.Count()
的方法,然后将查询传递给运行
.ToList()
的方法,则运行的是两个不同的查询

所以只需运行一次查询,并将结果存储在列表中。例如:

var userQuery = Users.AsNoTracking().Select(x => new
            {
   . . .
                    RoleId = c.Role.Id,
                    RoleName = c.Role.Name
                }
            });
 var user = userQuery.ToList();

您混淆了查询和集合

这:

不是对象的集合。这是一个疑问。如果将查询传递给运行
.Count()
的方法,然后将查询传递给运行
.ToList()
的方法,则运行的是两个不同的查询

所以只需运行一次查询,并将结果存储在列表中。例如:

var userQuery = Users.AsNoTracking().Select(x => new
            {
   . . .
                    RoleId = c.Role.Id,
                    RoleName = c.Role.Name
                }
            });
 var user = userQuery.ToList();

让我们考虑一下。你有一个表,假设有100000条记录。过滤并应用分页设置后,查询将以一页记录结束,假设有100个这样的项。从项目数(示例中为100)中,您无法推断总数(示例中为100000)。如果我们看一下这些字段,这些字段都没有给出任何关于记录总数的提示。为所有记录的计数添加一列将是一个极其糟糕的主意

因此,如果我们保持合理,那么我们承认,您打算作为唯一查询的查询不会向您提供任何有关计数的信息。要纠正这种情况,您需要将该计数存储为一个。如果以这种方式缓存了计数,那么就可以使用该服务器变量并在任何时候重用它,而不是在每次加载时对其进行硬计算。但是,为了确保这项工作正常进行,您需要保持该值:

  • 每当插入这样的记录时,增加服务器上的计数值
  • 每当删除这样的记录时,都会减少服务器上的计数值
  • 每当取消删除此类记录时,增加服务器上的计数值
  • 当然,如果发生批量插入、删除或取消删除,则需要相应地更改计数
  • 您还需要一个heartbeat任务来确保您拥有的服务器变量与实际计数同步,因为记录也可以在应用程序外部创建/删除/更新,至少可以通过在数据库上执行直接查询来实现

    • 让我们考虑一下这个问题。你有一个表,假设有100000条记录。过滤并应用分页设置后,查询将以一页记录结束,假设有100个这样的项。从项目数(示例中为100)中,您无法推断总数(示例中为100000)。如果我们看一下这些字段,这些字段都没有给出任何关于记录总数的提示。为所有记录的计数添加一列将是一个极其糟糕的主意

      因此,如果我们保持合理,那么我们承认,您打算作为唯一查询的查询不会向您提供任何有关计数的信息。要纠正这种情况,您需要将该计数存储为一个。如果以这种方式缓存了计数,那么就可以使用该服务器变量并在任何时候重用它,而不是在每次加载时对其进行硬计算。但是,为了确保这项工作正常进行,您需要保持该值:

      • 每当插入这样的记录时,增加服务器上的计数值
      • 每当删除这样的记录时,都会减少服务器上的计数值
      • 每当取消删除此类记录时,增加服务器上的计数值
      • 当然,如果发生批量插入、删除或取消删除,则需要相应地更改计数
      • 您还需要一个heartbeat任务来确保您拥有的服务器变量与实际计数同步,因为记录也可以在应用程序外部创建/删除/更新,至少可以通过在数据库上执行直接查询来实现

      没有人。问题不在这里。问题是它=>第一个查询将请求发送到数据库。然后再次发送寻呼请求,然后。我的问题是。如何处理向数据库发送一个请求的查询“如何处理向数据库发送一个请求的查询”您可以查询每页的完整结果,查询完整结果,并将其缓存,或者您可以使用不需要计算每页完整结果行数的分页实现。问题不在这里。问题是它=>第一个查询将请求发送到数据库。然后再次发送寻呼请求,然后。我的问题是。如何处理向数据库发送一个请求的查询“如何处理向数据库发送一个请求的查询”您可以查询每页的完整结果,查询完整结果并缓存它,或者您可以使用不需要计算每页完整结果中的行数的分页实现。
      var userQuery = Users.AsNoTracking().Select(x => new
                  {
         . . .
                          RoleId = c.Role.Id,
                          RoleName = c.Role.Name
                      }
                  });
       var user = userQuery.ToList();