gpt4 book ai didi

c# - PagedList.Mvc 返回表中的所有记录

转载 作者:太空宇宙 更新时间:2023-11-03 13:11:58 28 4
gpt4 key购买 nike

我的通用存储库中有以下功能。 var list = query.ToPagedList(pageNumber, pageSizeNumber);

这行有两个问题
public IEnumerable<T> GetPagedListDbContext(string searchFieldName, string searchText, string searchOperator, string sortFieldName, int? page, int? pageSize)
{
int pageSizeNumber = (pageSize ?? 20);
int pageNumber = (page ?? 1);
string sql = string.Empty;

sql = string.Format("Select * From {0} q ", typeof(T).Name);
switch (searchOperator)
{
case "Starts With":
sql += string.Format("Where q.{0} like '{1}%' ", searchFieldName, searchText);
break;
case "Ends With":
sql += string.Format("Where q.{0} like '%{1}' ", searchFieldName, searchText);
break;
case "Contains":
sql += string.Format("Where q.{0} like '%{1}%' ", searchFieldName, searchText);
break;
case "Equal To":
sql += string.Format("Where q.{0} == '{1}' ", searchFieldName, searchText);
break;
case "Not Equal To":
sql += string.Format("Where q.{0} != '{1}' ", searchFieldName, searchText);
break;
}

if (sortFieldName == null)
{
sql += "Order By q.Id ";
}
else
{
sql += string.Format("Order By q.{0} ", sortFieldName);
}

// RepoDbSet is DbSet
DbSqlQuery<T> query = RepoDbSet.SqlQuery(sql);
var list = query.ToPagedList(pageNumber, pageSizeNumber);

return list;
}
  1. 它返回表中的所有记录。 (下面的sql跟踪)
  2. 它执行相同的查询两次。

    SQL 跟踪事件类文本数据

    RPC: 完成 exec sp_reset_connection

    SQL:BatchCompleted Select * From Book q Order By q.Id

    RPC: 完成 exec sp_reset_connection

    SQL:BatchCompleted Select * From Book q Order By q.Id

    跟踪已停止

问题:为什么在没有 SkipTake 的情况下执行查询(例如,OFFSET 0 ROWS FETCH NEXT 20 ROWS ONLY)?

为什么执行两次?

当我检查最后一行 return list 时,它的总计数为 20,而不是表中的总行数,并且没有再次访问数据库。它是如何查询的?

是否可以使用 Linq 执行相同的过程?

最佳答案

在幕后,ToPagedList 将执行两个操作:

获取记录总数(知道会有多少页):

query.Count()

获取当前记录页:

query.Skip((pageNumber - 1) * pageSize).Take(pageSize)

这些会导致您看到的两个查询。

它将运行您的自定义串联 SQL,在内存中创建对象集合,然后对该集合执行LINQ to objects

在谈到 LINQ 时,这是需要理解的重要一点。如果集合支持 IQueryable,则集合将传递一个表达式树,它可以仔细地将其转换为适当的 SQL。

如果它只支持 IEnumerable,那么查询将在内存中的对象集合上进行操作。

显然 DbSqlQuery 没有实现 IQueryable。

您应该公开底层表对象(EntityFramework?Linq2Sql?什么 ORM?)并在其上运行查询,而不是连接 SQL:

var books = context.Books; //or whatever

var query = books.Where(b => b.Name == "Something");

// You can build up a query by chaining more operataions
// on to it
query = query.Where(b => b.PublishDate < DateTime.Today);

query = query.OrderBy(b => b.Id);

// Your ORM may be able to handle the StartsWith, EndsWith,
// Contains string methods. Check its documentation.
query = query.Where(b => b.Name.StartsWith("The"))

// Since the query object implements IQueryable, it can translate into
// two appropriate SQL queries.
return query.ToPagedList(2, 50);

相关:Returning IEnumerable<T> vs. IQueryable<T>

关于c# - PagedList.Mvc 返回表中的所有记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28142528/

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