我有一個分頁類,其中包含一個ApplyFilter()方法,用于過濾當前頁面的行。由于分頁通常僅在排序結果中有意義,因此此方法接受并回傳 an IOrderedQueryable<T>(而不僅僅是 a IQueryable<T>)。
我像這樣使用它:
var query = DbContext.Items
.Where(i => i.Value > 0)
.OrderBy(i => i.SortColumn);
query = pagination.ApplyFilter(query);
但是我的ApplyFilter()方法有問題。
public IOrderedQueryable<T> ApplyFilter<T>(IOrderedQueryable<T> query)
{
return query.Skip((CurrentPage - 1) * PageSize).Take(PageSize);
}
該Skip()和Take()方法都回傳了IQueryable<T>,所以我得到一個錯誤的回傳值不能轉換IQueryable<T>到IOrderedQueryable<T>。
如何使用Skip()和Take(),仍然有一個IOrderedQueryable<T>?
uj5u.com熱心網友回復:
你可以做一些俗氣的事情,比如
public IOrderedQueryable<T> ApplyFilter<T>(IOrderedQueryable<T> query)
{
return query.Skip((CurrentPage - 1) * PageSize).Take(PageSize).OrderBy(i=>1);
}
至少對于 SQL Server,代碼生成器足夠聰明,可以忽略 OrderBy。
或者將回傳型別更改為IQueryable<T>,并且不要重用查詢變數:
var q = db.Set<User>().OrderBy(u => u.id);
var q2 = ApplyFilter(q);
或者將引數和回傳型別更改為IQueryable<T>并拋出 ArgumentException 如果有人傳遞了一個不是IOrderedQueryable<T>
public IQueryable<T> ApplyFilter<T>(IQueryable<T> query)
{
if (query is IOrderedQueryable<T> oq )
{
return oq.Skip((CurrentPage - 1) * PageSize).Take(PageSize);
}
else
{
throw new ArgumentException("Query must be IOrderdQueryable<T>");
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/390086.html
標籤:C# 实体框架 实体框架核心 可查询的 .net-6.0
上一篇:使用可為空ID的FK到同一個表
下一篇:在EF6中保存之前丟棄無效物體
