假设我的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}}我需要在多个地方进行更改。
我的问题是:如何干预订单。我如何有一个地方,我在那里定义了如何完成项目列表的排序。
我肯定不能成为第一个提出这类问题的人。提示将非常受欢迎。
答案 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();
}
}