无法将类型为“ Microsoft.EntityFrameworkCore.Internal.InternalDbSet`1 [XXX]”的对象强制转换为类型为“ System.Linq.IOrderedQueryable`1 [xxx]”的

时间:2018-08-19 03:18:34

标签: c# asp.net entity-framework asp.net-core

我在asp.net核心中使用存储库模式使用通用过滤器/排序。请继续获取错误

  

无法转换类型为'Microsoft.EntityFrameworkCore.Internal.InternalDbSet'1 [Data.Models.AdminRole]'的对象来键入'System.Linq.IOrderedQueryable'1 [Data.Models.AdminRole]'。

public virtual async Task<ICollection<T>> SearchAsync(SearchQuery<T> searchQuery)
{
    IQueryable<T> sequence = _entities.Set<T>();
    sequence = ManageFilters(searchQuery);
    sequence = ManageIncludeProperties(searchQuery, sequence);
    sequence = ManageSortCriterias(searchQuery, sequence);
    return await GetTheResult(searchQuery, sequence);
}

错误出现在下面的代码entity =((IOrderedQueryable<T>)entity).OrderBy(x => (true));的else部分中。由于ManageFilters中的序列未如屏幕截图所示转换为查询。

protected virtual IQueryable<T> ManageSortCriterias(SearchQuery<T> searchQuery, IQueryable<T> entity)
{
    if (searchQuery.SortCriterias != null && searchQuery.SortCriterias.Count > 0)
    {
        var sortCriteria = searchQuery.SortCriterias[0];
        var orderedSequence = sortCriteria.ApplyOrdering(entity, false);

        if (searchQuery.SortCriterias.Count > 1)
        {
            for (var i = 1; i < searchQuery.SortCriterias.Count; i++)
            {
                var sc = searchQuery.SortCriterias[i];
                orderedSequence = sc.ApplyOrdering(orderedSequence, true);
            }
        }
        entity = orderedSequence;
    }
    else
    {
        entity = ((IOrderedQueryable<T>)entity).OrderBy(x => (true));
    }
    return entity;
}

管理过滤器。因为当我没有任何过滤器时,条件会转到else部分,然后在ManageSortCriterias方法else部分中产生错误。

protected virtual IQueryable<T> ManageFilters(SearchQuery<T> searchQuery)
{
    IQueryable<T> sequence = _entities.Set<T>();
    if (searchQuery.Filters != null && searchQuery.Filters.Count > 0)
    {
        foreach (var filterClause in searchQuery.Filters)
        {
            sequence = _entities.Set<T>().Where(filterClause);
        }
    }
    return sequence;
}

下面的屏幕快照显示了内部的序列数据。

added query

0 个答案:

没有答案