LINQ C # комбинированный список, удаление дубликатов - PullRequest
0 голосов
/ 06 января 2012

Я пытаюсь удалить дубликаты из списка, привязанного к сетке. Однако независимо от того, что я делаю, дубликаты остаются.

Переменная 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 ]

2 голосов
/ 06 января 2012

Вы должны указать Distinct, что фильтровать, используя IEqualityComparer, у него нет способа определить, что отличается в данный момент.

1 голос
/ 06 января 2012

Я вижу, что вы используете метод расширения .Cast<>() для приведения результирующих элементов к object, что указывает на то, что у вас возникла проблема при согласовании двух анонимных типов.Предполагая, что результаты query1 и query2 являются анонимными типами с одинаковыми именами и типами свойств, это не должно иметь место.

Анонимные типы предоставляют переопределенные методы Equals() и GetHashCode(), которые являютсяопределяется в терминах Equals() и GetHashCode() реализаций свойств.Поэтому оператор .Distinct() должен работать для двух объектов анонимного типа одного и того же типа, не требуя реализации IEqualityComparer.

Попробуйте удалить методы расширения .Cast<object>() из ваших запросов.Операция .Union(), которую вы в дальнейшем выполняете, будет допустимой, только если два запроса имеют одинаковые типы данных.Если это так, ваш метод .Distinct() должен нормально работать.

Надеюсь, это поможет.

...