我找到了一个处理LINQ排序和分页的扩展方法。虽然这很有效,但我试图看看是否还有其他方法可以使用它。
目前,extension method的代码如下:
public static IQueryable<T> Page<T, TResult>(
this IQueryable<T> obj,
int page,
int pageSize,
System.Linq.Expressions.Expression<Func<T, TResult>> keySelector,
bool asc,
out int rowsCount)
{
rowsCount = obj.Count();
int innerRows = (page - 1) * pageSize;
if (asc)
return obj.OrderBy(keySelector).Skip(innerRows).Take(pageSize).AsQueryable();
else
return obj.OrderByDescending(keySelector).Skip(innerRows).Take(pageSize).AsQueryable();
}
该方法接受一个基于类型的表达式。
在我的Dealer类中,我有一个方法GetDealers,它基本上调用了这个, 即
db.User.Page(1, 2, p => p.User.UserProperty.Name, true, out rowCount)
从介绍方面来看,我不知道或不能访问上述表达,例如
ListView1.DataSource = users.GetDealers("SortColumn", pageNo, pageSize, out rowCount, bool asc);
ListView1.DataBind();
唯一的方法是在我的GetDealers方法中有一个switch语句,然后转换为表达式。有没有办法绕过这个,或者这个方法好吗?
答案 0 :(得分:5)
我不确定你在问什么,但我相信这是我对自己的看法。如果您想知道如何根据字符串动态排序结果,而不是正确的LINQ表达式,那么您很幸运。
Scott Guthrie在这个话题上发表了一篇很棒的article。它引用了一个Microsoft文件,它扩展了任何IQueryable
对象以支持动态排序。
C# Dynamic Query Library (included in the \LinqSamples\DynamicQuery directory)。只需将页面添加到App_Code
文件夹并在项目中包含“使用System.Linq.Dynamic”,您就可以使用以下语法:
myUsers = myUsers.OrderBy("LastName");
我希望这有帮助!
答案 1 :(得分:0)
如果您正在寻找适用于所有类型的扩展方法
public static class SortingAndPagingHelper
{
/// <summary>
/// Returns the list of items of type on which method called
/// </summary>
/// <typeparam name="TSource">This helper can be invoked on IEnumerable type.</typeparam>
/// <param name="source">instance on which this helper is invoked.</param>
/// <param name="sortingModal">Page no</param>
/// <returns>List of items after query being executed on</returns>
public static IEnumerable<TSource> SortingAndPaging<TSource>(this IEnumerable<TSource> source, SortingAndPagingInfo sortingModal)
{
// Gets the coloumn name that sorting to be done o`enter code here`n
PropertyInfo propertyInfo = source.GetType().GetGenericArguments()[0].GetProperty(sortingModal.SortColumnName);
// sorts by ascending if sort criteria is Ascending otherwise sorts descending
return sortingModal.SortOrder == "Ascending" ? source.OrderByDescending(x => propertyInfo.GetValue(x, null)).Skip(sortingModal.PageSelected * sortingModal.PageSize).Take(sortingModal.PageSize)
: source.OrderBy(x => propertyInfo.GetValue(x, null)).Skip(sortingModal.PageSelected * sortingModal.PageSize).Take(sortingModal.PageSize);
}
}
DbContext dbContext = new DbContext();
dbContext.rainingSessions.Where(x => x.RegistrationDeadline > DateTime.Now) .SortingAndPaging(sortAndPagingInfo).ToList()