不确定这是否是最好的方法,但是到目前为止,这是我的代码。当前,它保留第一个重复项,并从表中删除其他重复项。我希望它保留编号最大的OrderId
的最后一行,并删除其余的行。我尝试使用Take
而不是Skip
,但似乎无法使其正常运行。
var duplicateRow = (from o in db.Orders
group o by new { o.CustomerId } into results
select results.Skip(1)
).SelectMany(a => a);
db.Orders.DeleteAllOnSubmit(duplicateRow);
db.SubmitChanges();
答案 0 :(得分:5)
由于您不使用OrderBy
,因此结果是任意的
我希望它保留'OrderId'编号最大的最后一行
然后使用:
var duplicateRows = db.Orders
.GroupBy(x => x.CustomerId)
.SelectMany(g => g.OrderByDescending(o => OrderId).Skip(1));
答案 1 :(得分:0)
您可以使用Reverse():
using System;
using System.Linq;
public class Program
{
public class O
{
public int CustomerId;
public int OrderId;
public O(int c,int o)
{
CustomerId = c;
OrderId = o;
}
public override string ToString()
{
return string.Format("(C_ID: {0}, O_ID:{1})",CustomerId, OrderId);
}
}
public static void Main()
{
var data = new O[]{ new O(1,1),new O(2,1),new O(3,1),new O(1,2)};
var duplicateRow = (from o in data
group o by new { o.CustomerId } into results
select results.Reverse().Take(1) // reverse and then take 1
).SelectMany(a => a);
foreach( var o in duplicateRow)
Console.WriteLine(o);
Console.ReadLine();
}
}
输出:
(C_ID: 1, O_ID:2)
(C_ID: 2, O_ID:1)
(C_ID: 3, O_ID:1)
这是出于稳定性的考虑-如果您的输入中的OrderID较早,那么您也需要OrderBy。