干掉LINQ to SQL代码(特定于orderby)

时间:2010-10-19 10:41:40

标签: linq-to-sql dry

假设我的SQL服务器中有一个名为Projects的表。 我的dbml文件有Project对象,我在MVC应用程序的多个视图中使用了一个Projects列表。

事情是:订购。

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

我想要按Name排序,然后按Code排序。

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

容易。

现在,我在几个视图中使用这个项目列表,在Where子句中使用不同的语句。

我需要添加相同的.Ordery(q=>q.Name).ThenBy(q=>q.Code)

这不是DRY。

如果我要更改顺序,先将code更改为name,然后按{{1}}我需要在多个地方进行更改。

我的问题是:如何干预订单。我如何有一个地方,我在那里定义了如何完成项目列表的排序。

我肯定不能成为第一个提出这类问题的人。提示将非常受欢迎。

4 个答案:

答案 0 :(得分:3)

您可以轻松编写自己的扩展方法(甚至是常规方法)来执行此操作:

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

然后使用:

_db.Projects.InStandardOrder()

答案 1 :(得分:2)

这可能不是你喜欢的DRY,但是可以创建一个扩展类来应用于IEnumerable。

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

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

然后只需调用_db.Projects

上的扩展名

编辑:刚刚注意到Jon Skeet打败了我!

答案 2 :(得分:2)

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

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

这样你就不会重复自己了。

答案 3 :(得分:1)

使其完全通用:

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

    }
}