基本的に、2 番目のリストのすべての ID を使用してリストを作成し、doc1 の各項目がリストにあるかどうかを確認します。パフォーマンスに関しては、最良の選択ではないと思いますが、うまくいくはずです
var qry = from item in doc1.Descendants("Item")
where
!(from item2 in doc2.Descendants("Item")
select item2.Attribute("id"),Value
).ToList().Contains(item.Attribute("id").Value)
select item;
上記の linq-statement では、id のリストが doc1 のすべての要素に対して作成されていると思います。より良いオプションは、最初にリストを作成してから、次のステートメントでリストを使用することです。
List<string> items = (from item2 in doc2.Descendants("Item")
select item2.Attribute("id").Value
).ToList();
var qry = from item in doc1.Descendants("Item")
where !items.Contains(item.Attribute("id").Value)
select item;