2012-01-06 41 views
0

我想從列表中刪除重複項,我綁定到一個gridview。但是不管我做什麼,重複的東西都會留下。LINQ C#組合列表,刪除重複項

變量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; 

回答

1

我看到您正在使用.Cast<>()擴展方法將結果項目轉換爲object,這表明您在協調兩個匿名類型時遇到問題。假設query1query2的結果是具有相同屬性名稱和類型的匿名類型,則不應該如此。

匿名類型提供覆蓋它們在性質的Equals()GetHashCode()實現來定義Equals()GetHashCode()方法。因此,.Distinct()運算符應該爲兩個相同類型的匿名類型對象工作,而不需要IEqualityComparer實現。

嘗試從您的查詢中刪除.Cast<object>()擴展方法。如果兩個查詢具有相同的數據類型,則只有後續執行的.Union()操作纔可用。如果是這樣的話,你的.Distinct()方法應該可以正常工作。

希望這會有所幫助。

+0

非常感謝,你讓我意識到來自Axsale的OrderID是來自Orders的varchar和orderid,是數據類型int。刪除演員並添加另一個連接到AxSales解決了它。現在正確的訂單數量顯示! :) – KLIM8D 2012-01-06 15:39:56

+0

很高興能幫到你!歡迎來到Stack Overflow。請記住在允許的情況下將您的問題標記爲已回答。 – 2012-01-06 16:34:01

2

你需要告訴篩選上鮮明的東西,使用IEqualityComparer它並沒有確定什麼是獨特目前的一種方式。

+0

感謝您的回覆,請在下面查看我對Henk Holterman的評論,並回復您的答案。 – KLIM8D 2012-01-06 15:33:54