Преобразование Linq в XML-запрос из C # в VB.Net. Можете ли вы определить мою ошибку? - PullRequest
0 голосов
/ 01 декабря 2009

Я преобразую приведенный ниже запрос Linq из C # в VB.Net. Можете ли вы определить мою ошибку? Запрос объединяет 3 набора данных XML. Заранее спасибо!

C # - Этот отлично работает.

List<Course> courses =
  (from course in CourseXML.Descendants(ns + "row")
  join coursecategory in CourseCategoryXML.Descendants("Table") on (string)course.Attribute("code") equals (string)coursecategory.Element("DATA")
  join category in CategoryXML.Descendants("Table") on (string)coursecategory.Element("GRP") equals (string)category.Element("GRP")
  where (string)coursecategory.Element("RECTYPE") == "C"
  select new Course {
    CategoryCode = category.Element("GRP").Value,
      Code = course.Attribute("code").Value
  }).ToList<Course>();

В.Б. - Я не получаю результатов от этого, поэтому я подозреваю, что я либо кастую неправильно, либо присоединяюсь неправильно.

Dim result = (From course In CourseXML.Descendants(ns + "row") _
Join coursecategory In CourseCategoryXML.Descendants("Table") On CType(course.Attribute("code"), String) Equals CType(coursecategory.Element("DATA"), String) _
Join category In CategoryXML.Descendants("Table") On CType(coursecategory.Element("GRP"), String) Equals CType(category.Element("GRP"), String) _
Where CType(coursecategory.Element("RECTYPE"), String) = "C" _
Select New Course() With _ 
{ _
  .CategoryCode = category.Element("GRP").Value, _
  .Code = course.Attribute("code").Value _
}).ToList()

Ответы [ 2 ]

1 голос
/ 01 декабря 2009

Я использовал следующий сайт для конвертации: http://www.developerfusion.com/tools/convert/csharp-to-vb/

Dim courses As List(Of Course) = (From course In CourseXML.Descendants(ns & "row") _
    Join coursecategory In CourseCategoryXML.Descendants("Table") On DirectCast(course.Attribute("code"), String) = DirectCast(coursecategory.Element("DATA"), String) _
    Join category In CategoryXML.Descendants("Table") On DirectCast(coursecategory.Element("GRP"), String) = DirectCast(category.Element("GRP"), String) _
    Where DirectCast(coursecategory.Element("RECTYPE"), String) = "C" _
    Select New Course()).ToList(Of Course)()

Основным отличием является последний выбор.

0 голосов
/ 01 декабря 2009

Вы получаете разные результаты из-за кастов.

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

});

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...