使用OrderBy的存储库

The*_*Sky 1 c# linq asp.net-mvc

我正在尝试创建一个存储库类,它具有一个基于"sort"参数对结果进行排序的方法.我需要将它作为参数传递,因为我试图非常严格,我的存储库不返回IQueryable并且只返回List.问题是我不知道如何制作它以满足以下要求:

  1. 允许多列.
  2. 强烈键入返回的实体(没有列作为参数的列).
  3. 能够将特定列设置为降序.

这是否可能,或者存储库是否允许返回订购?存储库是否应该只能执行CRUD操作?也许返回IQueryable是最好的选择?

Jon*_*eet 7

也许你需要这样的东西:

public class Ordering<T>
{
    private readonly Func<IQueryable<T>, IOrderedQueryable<T>> transform;

    private Ordering(Func<IQueryable<T>, IOrderedQueryable<T>> transform)
    {
        this.transform = transform;
    }

    public static Ordering<T> Create<TKey>
        (Expression<Func<T, TKey>> primary)
    {
        return new Ordering<T>(query => query.OrderBy(primary));
    }

    public Ordering<T> ThenBy<TKey>(Expression<Func<T, TKey>> secondary)
    {
        return new Ordering<T>(query => transform(query).ThenBy(secondary));
    }

    // And more for the descending methods...

    internal IOrderedQueryable<T> Apply(IQueryable<T> query)
    {
        return transform(query);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后客户端可以创建一个Ordering<T>传递到存储库,并且存储库可以Apply使用IQueryable<T>.那有意义吗?

样品(略显傻)使用:

var ordering = Ordering<FileInfo>.Create(fi => fi.Length)
                                 .ThenBy(fi => fi.Name);
Run Code Online (Sandbox Code Playgroud)