Divide it into many simple queries, and then put these queries together.
Let's start by creating a sequence of elements that match by name:
var nameMatches = from item in itemList where item.Name == p.Name select item;
p. ? :
var pnames = from subitem in p.SubItems select subitem.Name;
nameMatches, . ? , , pnames, :
var matches = from item in nameMatches
let subitemNames =
(from subitem in item.SubItems select subitem.Name)
where pnames.SequenceEqual(subitemNames)
select item;
, - ?
return matches.Any();
, . , !
return (
from item in itemList
let pnames =
(from psubitem in p.SubItems select psubitem.Name)
let subitemNames =
(from subitem in item.SubItems select subitem.Name)
where item.Name == p.Name
where pnames.SequenceEqual(subitemNames)
select item).Any();
. ! , , , .