我第一次使用Linq To Sql作为我的数据库层,我遇到了一个问题。基本上,我有一个允许用户创建预定义作业的表单。预定义作业可以具有许多预定义作业项。例如,预定义的工作可能类似于换油。预定义的作业项目将是石油,人工等。在我的数据库中,PredefinedJobs是一个表,PredefinedJobItems是另一个表,其外键返回PredefinedJobs。我有一个表单用于添加预定义的作业,其中Linq-to-Sql类将表单作为类变量支持。表单上有一个ListView,显示所有作业项。一项新功能要求我跟踪ListView中项目的位置。例如,如果我的项目ListView如下所示,请记下订单:
Qty Name Desc ItemOrder
4 Oil Penzoil 0
1 Labor 1
因为项目是通过子表单添加的,所以我不想提供对ListView的访问。因此,我创建了下面的方法,试图创建ItemOrder并将PredefinedJob Linq上的集合排序为Sql对象。似乎List上的OrderBy函数实际上并未对PredefinedJob上的集合进行排序。什么是维护Linq to Sql集合(即PredefinedJob.fkJobItems)的最佳方法?或者,将我的ListView的引用传递给子表单会更好吗,该表单将项目添加到我可以访问selectedIndex的作业中?
private SortAndOrderItems(List<PredefinedJobsItem> items)
{
var nextItemOrderNumber = items.Max(max => max.ItemOrder) + 1;
foreach (var item in items)
{
if (item.ItemOrder == null)
{
item.ItemOrder = nextItemOrderNumber;
nextItemOrderNumber++;
}
}
items.OrderBy(i => i.ItemOrder).ToList();
}
答案 0 :(得分:9)
OrderBy
会创建一个新查询,执行时不会更改原始列表。
为什么不只是List
的<{3}}方法?
items.Sort((a, b) => a.ItemOrder.CompareTo(b.ItemOrder));
答案 1 :(得分:0)
我认为您正在寻找 List<>.Sort
class Cmp : IComparer<PredefinedJobsItem>
{
public int Compare(PredefinedJobsItem x, PredefinedJobsItem y)
{
return x.ItemOrder.CompareTo(y.ItemOrder);
}
}
var comparison = new Cmp();
items.Sort(comparison);