Для меня работает следующее:
static void Main(string[] args)
{
var xDoc = XDocument.Parse(
@"<root>
<product>
<cat1>ABC</cat1>
<cat2>123</cat2>
</product>
<product>
<cat1>XYZ</cat1>
</product>
</root>");
var query = from k in xDoc.Descendants("product")
select new
{
KategoriKod = (string)k.Element("cat1") + (string)k.Element("cat2")
};
foreach(var k in query)
{
Console.WriteLine(k);
}
}
Вот результат:
{KategoriKod = ABC123} {KategoriKod = XYZ} Нажмите любую клавишу, чтобы продолжить.,.
Обратите внимание, что я использовал оператор явного преобразования (приведение элементов к строке), чтобы избежать исключений NullReferenceException при вызове .Value для несуществующих элементов.