fix(module: table): ReloadData() can't invoke OnChange (#2071)

* fix(module: table): optimized query API for EF

* fix table ReloadData() can't invoke OnChange
This commit is contained in:
James Yeung 2021-10-29 22:32:46 +08:00 committed by GitHub
parent 961a5ca02b
commit 26d880f8ed
3 changed files with 44 additions and 25 deletions

View File

@ -214,9 +214,7 @@ namespace AntDesign
FlushCache(); FlushCache();
this.InternalReload(); this.ReloadAndInvokeChange();
StateHasChanged();
} }
public QueryModel GetQueryModel() => BuildQueryModel(); public QueryModel GetQueryModel() => BuildQueryModel();
@ -281,6 +279,7 @@ namespace AntDesign
private QueryModel<TItem> InternalReload() private QueryModel<TItem> InternalReload()
{ {
var queryModel = BuildQueryModel(); var queryModel = BuildQueryModel();
_currentQueryModel = queryModel;
if (ServerSide) if (ServerSide)
{ {
@ -291,25 +290,10 @@ namespace AntDesign
{ {
if (_dataSource != null) if (_dataSource != null)
{ {
var query = _dataSource.AsQueryable(); var query = queryModel.ExecuteQuery(_dataSource.AsQueryable());
foreach (var sort in queryModel.SortModel.OrderBy(x => x.Priority))
{
query = sort.SortList(query);
}
foreach (var filter in queryModel.FilterModel)
{
query = filter.FilterList(query);
}
_total = query.Count(); _total = query.Count();
_showItems = queryModel.CurrentPagedRecords(query);
query = query.Skip((PageIndex - 1) * PageSize).Take(PageSize);
queryModel.SetQueryableLambda(query);
_currentQueryModel = queryModel;
_showItems = query;
} }
else else
{ {

View File

@ -10,6 +10,8 @@ namespace AntDesign.TableModels
public int PageSize { get; } public int PageSize { get; }
public int OffsetRecords => (PageIndex - 1) * PageSize;
public IList<ITableSortModel> SortModel { get; private set; } public IList<ITableSortModel> SortModel { get; private set; }
public IList<ITableFilterModel> FilterModel { get; private set; } public IList<ITableFilterModel> FilterModel { get; private set; }
@ -31,9 +33,6 @@ namespace AntDesign.TableModels
public class QueryModel<TItem> : QueryModel public class QueryModel<TItem> : QueryModel
{ {
[JsonIgnore]
public IQueryable<TItem> QueryableLambda { get; private set; }
internal QueryModel(int pageIndex, int pageSize) : base(pageIndex, pageSize) internal QueryModel(int pageIndex, int pageSize) : base(pageIndex, pageSize)
{ {
} }
@ -48,9 +47,21 @@ namespace AntDesign.TableModels
FilterModel.Add(model); FilterModel.Add(model);
} }
internal void SetQueryableLambda(IQueryable<TItem> query) public IQueryable<TItem> ExecuteQuery(IQueryable<TItem> query)
{ {
this.QueryableLambda = query; foreach (var sort in SortModel.OrderBy(x => x.Priority))
{
query = sort.SortList(query);
}
foreach (var filter in FilterModel)
{
query = filter.FilterList(query);
}
return query;
} }
public IQueryable<TItem> CurrentPagedRecords(IQueryable<TItem> query) => query.Skip(OffsetRecords).Take(PageSize);
} }
} }

View File

@ -0,0 +1,24 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace AntDesign.TableModels
{
public static class QueryableExtensions
{
public static IQueryable<TItem> ExecuteTableQuery<TItem>(this IQueryable<TItem> source, QueryModel<TItem> queryModel)
{
return queryModel.ExecuteQuery(source);
}
public static IQueryable<TItem> CurrentPagedRecords<TItem>(this IQueryable<TItem> source, QueryModel<TItem> queryModel)
{
return queryModel.CurrentPagedRecords(source);
}
}
}