2014-05-19 49 views
1

我有一個表與列(ItemID,名稱,價格)。如何刪除重複項(不同的值)與主鍵

項目列表中填充了重複的項目。

對於前:

-------------------------------------- 
ItemID   Name   Price 
-------------------------------------- 
1    Bangles  100 
2    Saree   200 
3    Shoes   150 
4    Bangles  100 
5    Shoes   150 

如何使用LINQ無論主鍵的只有兩列在列表中刪除重複的?

+2

你知道那些實際上並不重複,因爲「手鐲」和「鞋子」你的兩個條目具有不同的條目標識的,對不對? –

+0

是的項目id不同。但我的問題是重複沒有主鍵 – SrinivasNaidu

+0

其數據庫表 – SrinivasNaidu

回答

4

想法是按條件對項目進行分組,然後選擇每個組中的第一項。

var distinctItems = items.GroupBy(i => new{i.Name, i.Price}) 
         .Select(g => g.First()); 

下面是完整的例子:

var items = new[]{ 
        new Item{Id = 1, Name = "Bangles", Price = 100}, 
        new Item{Id = 2, Name = "Saree", Price = 200}, 
        new Item{Id = 3, Name = "Shoes", Price = 150}, 
        new Item{Id = 4, Name = "Bangles", Price = 100}, 
        new Item{Id = 5, Name = "Shoes", Price = 150} 
       }; 


var distinctItems = items.GroupBy(i => new{i.Name, i.Price}) 
         .Select(g => g.First()); 

foreach (var item in distinctItems) 
{ 
    Console.WriteLine ("Name: {0} Price: {1}", item.Name, item.Price); 
} 

打印:

Name: Bangles Price: 100 
Name: Saree Price: 200 
Name: Shoes Price: 150 

注意:考慮使用DistinctBy其使用更先進的算法通過一些標準來選擇不同的對象。

+0

但我想從表中刪除重複的記錄 – SrinivasNaidu

+0

@SrinivasNaidu你在問題中提到*如何刪除**列表**中的重複使用linq只有兩列,而不考慮主鍵*。這更多的是SQL或ORM問題。 –

+0

對於過濾返回的列表,也許他可以簡單地使用'var distinctItems = items.Select(i => new {i.Name,i.Price,})。Distinct();'。目前還不清楚他如何處理'姓名'與'價格'衝突的情況。 –

0

使用的GroupBy

items.GroupBy(item => new { Name = item.Name, Price = item.Price }) 

這將它們分組,然後你決定你想要做的,拿到第一個或最後例如什麼。

0

如果有很多重複的,那麼它是更有效直接在SQL做到這一點,但如果你想使用LINQ來做到這一點,那麼你可以這樣做:

// Group and count the items in group 
var grouped = (from r in dc.Items group r by new { r.Name, r.Price} into results 
    select new { Count = results.Count(), results = results.ToList()}); 

// select only the groups with duplicates 
var itemsWithDuplicates = (from r in grouped where r.Count > 1 select r); 

// Ignore the first item in each group 
var duplicatesGrouped = (from r in itemsWithDuplicates select r.results.Skip(1)); 

//UnGroup them 
var duplicates = duplicatesGrouped.SelectMany(r=>r); 

然後想必你可以使用像

dc.Items.DeleteAllOnSubmit(duplicates); 
dc.SubmitChanges(); 
0

從我的意見,我把它你正在一個數據庫上工作。從這裏你應該有一個可用的上下文。

所以,你應該能夠沿着這條線做一些事情:

void Main() 
{ 
    //dummy data 
    var items = new List<Item>() 
       { 
        new Item{Id =1, Name = "Bangles", Price=100}, 
        new Item{Id =2, Name = "Saree", Price=200}, 
        new Item{Id =3, Name = "Shoes", Price=150}, 
        new Item{Id =4, Name = "Bangles", Price=100}, 
        new Item{Id =5, Name = "Shoes", Price=150} 
       }; 
    //select duplicate items   
    var itemsToDelete = items.GroupBy (i => new { i.Name, i.Price}).SelectMany(x => x.Skip(1)); 
    //delete duplicate items 
    context.DeleteAllOnsubmit(itemsToDelete); 
    //Save 
    context.SaveChanges(); 

} 

public class Item 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public int Price { get; set; } 
} 

在下面的圖片,你必須在第一原始數據和第二個表顯示將從源中刪除重複項:

enter image description here