使用LINQ获取两个表之间的差异

时间:2012-01-06 09:53:21

标签: c# linq

我有一个现有的表和一个新表。 这些表至少包含两个需要检查的项目。 我需要做以下事项

1)获取不在新表中但在现有表中的项目列表。 - 所以他们可以被删除 2)获取新表中但不在现有表中的项目列表 - 因此可以添加它们

3)获取两个表中的项目列表,但现有表格需要更新

这是数据

var existingItems = new[] 
{ 
    new RetryItem { CellId = 1, Content = "Bob" }, 
    new RetryItem { CellId = 2, Content = "Bill" }, 
    new RetryItem { CellId = 3, Content = "Frank" }, 
    new RetryItem { CellId = 4, Content = "Tom" }, 
    new RetryItem { CellId = 5, Content = "Dick" }, 
    new RetryItem { CellId = 6, Content = "Harry" }, 
}; 

var newItemsLarger = new[] 
{ 
    new RetryItem { CellId = 1, Content = "Bob" }, 
    new RetryItem { CellId = 2, Content = "Bill" }, 
    new RetryItem { CellId = 3, Content = "Frank" }, 
    new RetryItem { CellId = 4, Content = "Tom now Thoams" }, 
    new RetryItem { CellId = 5, Content = "Dick now Dicky" }, 
    new RetryItem { CellId = 6, Content = "Harry Now Harriet" }, 
    new RetryItem { CellId = 7, Content = "Mary" }, 
    new RetryItem { CellId = 8, Content = "Mungo" }, 
    new RetryItem { CellId = 9, Content = "Midge" }, 
};

2 个答案:

答案 0 :(得分:3)

我认为这些可能符合您的需求:

1)

var q1 = from c1 in existingItems
         join c2 in newItemsLarger 
         on new { c1.CellId, c1.Content } equals new {c2.CellId, c2.Content }
         select c1;

2)

var q2 = from c1 in newItemsLarger
         where !existingItems.Select(x => x.CellId).Contains(c1.CellId)
         select c1;

3)

var q3 = from c1 in existingItems
         join c2 in newItemsLarger on c1.CellId equals c2.CellId 
         where c1.Content != c2.Content
         select c2;

答案 1 :(得分:1)

您可以在控制台应用程序中使用以下示例程序:

using System.Linq;

namespace ExperimentConsoleApp
{
    class Program
    {
        static void Main()
        {
            // Check if the item is in existingItems but not in newItems
            var itemsToBeRemoved = (from e in existingItems
                                    where !newItemsLarger.Any(n => n.CellId == e.CellId)
                                    select e).ToList();

            // Check if the item is in newItems but not in existingItems 
            var itemsToBeAdded = (from n in newItemsLarger
                                  where !existingItems.Any(e => n.CellId == e.CellId)
                                  select n).ToList();

            // Match the items on Id and check if their contents equals
            var itemsToBeUpdated = (from e in existingItems
                                    from n in newItemsLarger
                                    where e.CellId == n.CellId && e.Content != n.Content
                                    select n).ToList();
        }

        static RetryItem[] existingItems = new[] 
                        { 
                            new RetryItem { CellId = 1, Content = "Bob" }, 
                            new RetryItem { CellId = 2, Content = "Bill" }, 
                            new RetryItem { CellId = 3, Content = "Frank" }, 
                            new RetryItem { CellId = 4, Content = "Tom" }, 
                            new RetryItem { CellId = 5, Content = "Dick" }, 
                            new RetryItem { CellId = 6, Content = "Harry" }, 
                        };

        static RetryItem[] newItemsLarger = new[] 
                        { 
                            new RetryItem { CellId = 1, Content = "Bob" }, 
                            new RetryItem { CellId = 3, Content = "Frank" }, 
                            new RetryItem { CellId = 4, Content = "Tom now Thoams" }, 
                            new RetryItem { CellId = 5, Content = "Dick now Dicky" }, 
                            new RetryItem { CellId = 6, Content = "Harry Now Harriet" }, 
                            new RetryItem { CellId = 7, Content = "Mary" }, 
                            new RetryItem { CellId = 8, Content = "Mungo" }, 
                            new RetryItem { CellId = 9, Content = "Midge" }, 
                        };
    }

    public class RetryItem
    {
        public int CellId { get; set; }
        public string Content { get; set; }
    }
}