Строка let txt = element.Element("Text")
возвращает XElement вместо текста, поэтому ваше условие CompareTo
взорвется вместо проверки текстовых значений.
Вместо этого вы можете получить значение узла через свойство .Value
.
...
let txt = element.Element("Text").Value
...
Строка var elements = from element in doc.Descendants("Question")
будет успешно искать элементы, но в качестве практики вы можете перейти от корневого узла или относительной иерархии.
...
var elements = from element in doc.Root.Descendants("Question")
...
Остальная часть кода выглядит нормально (меньше обработки исключений).
У меня сработало следующее ...
string xml = @"<Questions>
<Question>
<Id>1</Id>
<Text>aaa</Text>
</Question>
<Question>
<Id>2</Id>
<Text>bbb</Text>
</Question>
</Questions>";
string question = @"aaa";
var doc = XDocument.Parse(xml);
var elements = from element in doc.Root.Descendants("Question")
let txt = element.Element("Text").Value
where question.CompareTo(txt)==0
select new
{
Id = element.Element("Id").Value,
};
Console.WriteLine(elements.Count()); //1