2013-07-23 4 views
0

У меня есть 2 массива разных типов: один из файлов, а один из базы данных SQL - LINQ to SQL. Я пытаюсь удалить не совпадающие элементы из моей базы данных с элементами, которые я получаю через файл. (Я упоминаю об этом, если есть более эффективный способ сделать то, что я пытаюсь достичь).LINQ return non-matching items query

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

var a = new[] { 
    new { code = "A", subid = 1, test = "dunno" }, new { code = "A", subid = 2, test = "dunno" }, new { code = "A", subid = 3, test = "dunno" }, 
    new { code = "B", subid = 1, test = "dunno" }, new { code = "B", subid = 2, test = "dunno" }, new { code = "B", subid = 3, test = "dunno" } 
}; 
var c = new[] { 
    new { code = "A", subid = 1 }, new { code = "A", subid = 2 }, 
    new { code = "B", subid = 1 }, new { code = "B", subid = 2 } 
}; 

мне это нужно, чтобы вернуть предметы, которые не соответствуют, например, new { code = "A", subid = 3 } и new { code = "B", subid = 3 }

var b = (from items in a 
     where c.Any(d => d.code == items.code && d.subid != items.subid) 
     select items); 

и

var b = (from items in a 
     where c.Where(d=> d.code == items.code).Any(d => d.subid != items.subid) 
     select items); 

Я пробовал это, но они просто, кажется, возвращает все элементы. Как мне это сделать?

ответ

2

Использование Enumerable.Except

var nonMatchingItems = a.Except(c); 

Полный пример:

var a = new[] { 
    new { code = "A", subid = 1 }, 
    new { code = "A", subid = 2 }, 
    new { code = "A", subid = 3 }, 
    new { code = "B", subid = 1 }, 
    new { code = "B", subid = 2 }, 
    new { code = "B", subid = 3 } 
}; 

var c = new[] { 
    new { code = "A", subid = 1 }, 
    new { code = "A", subid = 2 }, 
    new { code = "B", subid = 1 }, 
    new { code = "B", subid = 2 } 
}; 

foreach(vat item in a.Except(c)) 
    Console.WriteLine(item); 

// { code = A, subid = 3 } 
// { code = B, subid = 3 } 

UPDATE (если у вас есть различные типы, и хотите, чтобы найти спички некоторого набора полей, а затем использовать объединение последовательностей, и удалите все товары от a, которые соответствуют некоторым товарам в c:

var matchingItems = from aa in a 
        join cc in c 
         on new { aa.code, aa.subid } equals // properties subset 
          new { cc.code, cc.subid } // same subset 
        select aa; // select inner item from join  

var nonMatchingItems = a.Except(matchingItems); 
+0

Анонимный массив в моем приложении не имеет соответствующих свойств. будет ли это работать? – Smithy

+0

Ну. Для анонимных объектов вам необходимо реализовать операции равенства. ;) –

+0

@ J.Steen уже реализовано :) –