代码之家  ›  专栏  ›  技术社区  ›  TheCloudlessSky

OrderBy存储库

  •  1
  • TheCloudlessSky  · 技术社区  · 14 年前

    1. 允许多列。
    2. 强类型到返回的实体(没有列作为参数的字符串)。
    3. 能够将特定列设置为降序。

    3 回复  |  直到 14 年前
        1
  •  7
  •   Jon Skeet    14 年前

    也许你需要这样的东西:

    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);
        }
    }
    

    然后客户机可以创建 Ordering<T> Apply IQueryable<T>

    var ordering = Ordering<FileInfo>.Create(fi => fi.Length)
                                     .ThenBy(fi => fi.Name);
    
        2
  •  3
  •   Matthew Vines    14 年前

    这是有争议的,但我认为您的存储库应该只返回数据。让您的消费类担心集合的顺序。

        3
  •  2
  •   Reed Copsey    14 年前

    IQueryable<T>

    例如,假设您有一个方法查询数据库以返回特定的表或视图。如果存储库的客户机只需要前10条记录,具有自定义条件和您不希望的排序,则可以通过返回 IQueryable<T> .Where(...).OrderBy(...).Take(10);

    ,跨数据层的调用将自动适应,并且只跨10条记录。如果返回一个列表,DB查询将提取每条记录,然后需要在应用程序中进行过滤。