LINQ C#组合列表,删除重复项

时间:2012-01-06 15:14:46

标签: c# linq list duplicates

我正在尝试从绑定到gridview的列表中删除重复项。然而,无论我做什么,副本仍然存在。

添加变量lol用于测试Distinct,但它不起作用。 目前的代码:

GWportalDataContext db = new GWportalDataContext();
    DeliveryTimeRepository dltRep = new DeliveryTimeRepository();

    var query = from o in db.Orders
                join y in db.OrderLines on o.OrderID equals y.OrderID
                join x in db.Products on y.ItemNumber equals x.ItemNumber
                where o.AccountNumber == AppSession.CurrentLoginTicket.AccountNumber
                select new
                {
                    o.OrderID,
                    o.AxaptaSalesId,
                    y.ItemNumber,
                    x.Name,
                    x.ProductFormatName,
                    y.Quantity,
                    y.Price,
                    Status = dltRep.getOrderStatus(o.OrderID, o.AxaptaSalesId, y.ItemNumber).Substring(0, dltRep.getOrderStatus(o.OrderID, o.AxaptaSalesId, y.ItemNumber).LastIndexOf("|")),
                    Levering = dltRep.getOrderStatus(o.OrderID, o.AxaptaSalesId, y.ItemNumber).Substring(dltRep.getOrderStatus(o.OrderID, o.AxaptaSalesId, y.ItemNumber).LastIndexOf("|")).Replace("|", "")
                };

    var query2 = from o in db.AxSales
                 join y in db.AxSaleLines on o.SalesId equals y.SalesId
                 join x in db.Products on y.ItemNumber equals x.ItemNumber
                 where o.AccountNumber == AppSession.CurrentLoginTicket.AccountNumber
                 select new
                 {
                     OrderID = o.SalesId,
                     AxaptaSalesId = o.SalesId,
                     y.ItemNumber,
                     x.Name,
                     x.ProductFormatName,
                     y.Quantity,
                     Price = y.SalesPrice,
                     Status = dltRep.getAxOrderStatus(o.SalesId, y.ItemNumber).Substring(0, dltRep.getAxOrderStatus(o.SalesId, y.ItemNumber).LastIndexOf("|")),
                     Levering = dltRep.getAxOrderStatus(o.SalesId, y.ItemNumber).Substring(dltRep.getAxOrderStatus(o.SalesId, y.ItemNumber).LastIndexOf("|")).Replace("|", "")
                 };

    //Query 1 start
    var dataToList = query.ToList();
    List<object> deletedItems = dataToList.Where(item => orderDeleted(item.OrderID, item.AxaptaSalesId)).Cast<object>().ToList();
    var datatoGrid = dataToList.Except(deletedItems);
    // Query 1 end

    //Query 2 start
    var dataToList2 = query2.ToList();
    List<object> deletedItems2 = dataToList2.Where(item => axOrderDeleted(item.AxaptaSalesId)).Cast<object>().ToList();
    var dataToGrid2 = dataToList2.Except(deletedItems2);
    //Query 2 end
    var combined = datatoGrid.Union(dataToGrid2);
    var lol = combined.Distinct();
    e.Result = lol;

2 个答案:

答案 0 :(得分:2)

你需要告诉区别要过滤的内容,使用IEqualityComparer它无法确定当前不同的内容。

答案 1 :(得分:1)

我发现您使用.Cast<>()扩展方法将结果项目转换为object,这表明您在协调两个匿名类型时遇到问题。假设query1query2的结果是具有相同属性名称和类型的匿名类型,则不应该是这种情况。

匿名类型提供了重写的Equals()GetHashCode()方法,这些方法是根据属性的Equals()GetHashCode()实现定义的。因此,.Distinct()运算符应该适用于两个相同类型的匿名类型对象,而不需要IEqualityComparer实现。

尝试从查询中删除.Cast<object>()扩展方法。如果两个查询具有相同的数据类型,则仅允许您随后执行的.Union()操作。如果是这种情况,您的.Distinct()方法应该可以正常工作。

希望这有帮助。

相关问题