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

耗尽LINQ-to-SQL代码(具体来说是orderby)

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

    假设我有一张桌子叫 Projects 在我的SQL服务器中。 我的dbml文件有 Project

    问题是:订购。

    默认情况下,使用linq,项目按ID排序。

    我想让他们按 Name 然后 Code

    _db.Projects.Ordery(q=>q.Name).ThenBy(q=>q.Code)
    

    容易的。

    现在,我在几个视图中使用这个项目列表,在 Where 条款。

    在任何地方我都需要添加相同的 .Ordery(q=>q.Name).ThenBy(q=>q.Code)

    如果我要更改订单 code 然后 name

    我的问题是:我怎么才能把订单弄干。我怎么会有一个地方,在那里我定义如何排序一个项目列表应该做。

    我当然不能第一个提出这种问题。小费会很受欢迎的。

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

    您可以很容易地编写自己的扩展方法(甚至普通方法)来执行以下操作:

    public static IQueryable<Project> InStandardOrder
        (this IQueryable<Project> source)
    {
        return source.OrderBy(q => q.Name).ThenBy(q => q.Code);
    }
    

    _db.Projects.InStandardOrder()
    
        2
  •  2
  •   Steve    14 年前

    这可能没有您想要的那么简单,但是可以创建一个扩展类来应用于IEnumerable。

    方法将按名称排序,然后按代码排序。

    public static IEnumerable<Project> DefaultOrder(this IEnumerable<Project> products){
        return projects.OrderBy(p => p.Name).ThenBy(p => p.Code);
    }
    

    然后简单地调用数据库项目的扩展

    编辑:刚刚注意到乔恩·斯凯特把我打得落花流水!

        3
  •  2
  •   Muhammad Hasan Khan    14 年前

    使用存储库模式。 为给定实体的每个查询创建存储库方法。

    public class OrderRepository
    {
        public IEnumerable<Project> GetProjects()
         {
            return projects.OrderBy(p=> p.Name).ThenBy(p=>p.Code);
         }
    
        public IEnumerable<Project> GetProjectsByID(int id)
        {
             return GetProjects().Where(p=>p.Id=id);
        }
    }
    

    这样你就不会重复了。

        4
  •  1
  •   ravndal    14 年前

    要使其完全通用:

    public interface IOrderByNameOnly
    {
        string Name { get; set; }
    }
    public interface IOrderByNameAndCode : IOrderByNameOnly
    {
        int Code { get; set; }
    }
    
    public static class OrderbyExtension
    {
        public static IEnumerable<T> OrderByNameAndCode<T>(this IEnumerable<T> source) 
            where T : IOrderByNameAndCode
        {
            return source.OrderBy(q => q.Name).ThenBy(q => q.Code);
        }
        public static IEnumerable<T> OrderByName<T>(this IEnumerable<T> source)
             where T : IOrderByNameOnly
        {
            return source.OrderBy(q => q.Name);
        }
    }   
    
    public class Person : IOrderByNameOnly
    {
        public string Name { get; set; }
    }
    public class Company : IOrderByNameAndCode
    {
        public int Code { get; set; }
        public string Name { get; set; }
    }
    
    public class SomeClass
    {
    
        void SomeMethod()
        {
            var persons = new List<Person>();
            var companies = new List<Company>();
    
            persons.OrderByName();
    
            companies.OrderByName();
            companies.OrderByNameAndCode();
    
        }
    }