Мне нравится использовать GroupJoin
для этого.
return objectImCheckingAgainst.GroupJoin(Obj.SubObj,
a => a.Id,
b => b.id,
(a, b) => b.Any())
.All(c => c);
Я считаю, что этот запрос должен быть более или менее очевидны, но, по сути, это объединяет две коллекции с использованием их соответствующих идентификаторов в качестве ключей, а затем группы этих результатов. Затем для каждой из этих групп он определяет, существуют ли какие-либо соответствия. Наконец, он гарантирует, что все группы имеют совпадения.
Полезной альтернативой, которую я иногда использую, является .Count() == 1
, а не .Any()
. Очевидно, разница заключается в том, хотите ли вы поддерживать несколько элементов с одинаковым совпадением идентификаторов. Из вашего описания это звучало так, что это не имеет значения или принуждено другими средствами. Но это простая замена, в любом случае.
Важным понятием в GroupJoin
, что я знаю, что это важно, но может или не может быть очевидным, является то, что первый перечислимы (который должен сказать, первый аргумент метода расширения или objectImCheckingAgainst
в этом примере) будет иметь все его элементы включены в результат, а второй - или нет. Это не похоже на Join
, где заказ не имеет значения. Если вы привыкли к SQL, это элементарные начала LEFT OUTER JOIN
.
Другим способом вы могли бы сделать это, несколько более просто, но не так эффективно, было бы просто гнездятся запросы:
return objectImCheckingAgainst.All(c => Obj.SubObj.Any(x => x.id == c.Id));
Я говорю это потому, что это очень похоже на пример вы предоставили.
У меня нет опыта работы с NHibernate, но я знаю, что многие ORM (я считаю, что EF включены) будут сопоставлять это с SQL, поэтому эффективность может быть или не быть проблемой. Но в общем, мне нравится писать LINQ как можно ближе к параметру, так как он работает так же хорошо, как и в базе данных, поэтому я бы пошел с первым, о котором я говорил.
Чтобы быть ясным, вам нужно «Obj.SubObj' иметь соответствующие идентификаторы для каждого элемента в 'objectImCheckingAgainst', но вы не заботитесь о другом? –
@Matthew, точно. Obj.SubObj может иметь больше предметов. Я хочу проверить подмножество в objectImCheckingAgainst. –