Вы получаете разные результаты из-за кастов.
coursecategory.Element ("RECTYPE"). Значение возвращает результат, отличный от
(строка) coursecategory.Element ("RECTYPE") == "C" (и, очевидно, CType (coursecategory.Element ("RECTYPE"), String) = "C").
Если в одном из ваших элементов отсутствует дочерний узел RECTYPE, вы не получите никаких результатов, если правильно его приведете, что вы делали в VB.NET.
В C # вы не приводили (string) coursecategory.Element ("RECTYPE") == "C" правильно. Если вы используете ToString () или .Value, вы получите правильные результаты.
Используйте coursecategory.Element ("RECTYPE"). Вместо этого используйте значение и вообще избегайте приведений.
Вы можете проверить это, изменив свой выбор на возвращаемый:
select new {
Wrong = (string)coursecategory.Element("RECTYPE"), // No exception ... incorrect result!
//Maybe = coursecategory.Element("RECTYPE").ToString() //throws NullReferenceException
//Right = (string)coursecategory.Element("RECTYPE").Value // throws NullReferenceException because of a missing element.
CategoryCode = category.Element("GRP").Value,
Code = course.Attribute("code").Value
});