C#跳过第一行,但希望它跳过最后一行

时间:2018-11-27 17:20:20

标签: c# linq

不确定这是否是最好的方法,但是到目前为止,这是我的代码。当前,它保留第一个重复项,并从表中删除其他重复项。我希望它保留编号最大的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();

enter image description here

2 个答案:

答案 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。