Условный выбор Linq to XML (вложенные операторы выбора) - PullRequest
1 голос
/ 29 марта 2011

Я пытаюсь просмотреть всех своих друзей из Facebook, которые ходили в какую-то школу.Я использую FQL, чтобы получить XML-файл, содержащий всех моих друзей с информацией об образовании.Но я не могу использовать FQL, чтобы выбирать только тех, кто ходил в одну школу.Поэтому я пытаюсь использовать Linq to XML для выбора только тех пользователей, которых я хочу.Я пробовал некоторые методы, но они не будут работать для меня.

Вот мой запрос linq:

XDocument doc = RemoveNamespace (XDocument.Load(url));

        string[] search = {"Katho", "katho", "kortrijk" , "vhti"};
       List<string> keys = new List<string>( search );



        var user = (from usr in doc.Descendants("user")

                                   select new fbUser
                                   {

                                       name = usr.Element("name").Value,

                                       email = usr.Element("email").Value,
                                       current_location = StringExtensions.checkNull(usr.Element("current_location").Value,""),
                                       hometown_location = usr.Element("hometown_location").Value,
                                       pic = StringExtensions.checkNull(usr.Element("pic_square").Value,"http://www.fox16.com/media/avatar/default.jpg"),
                                       education_history = (from edu in usr.Descendants("education_info")
                                                           //where usr.Element("education_history").HasElements
                                                           where keys.Contains(edu.Element("name").Value)
                                                           select new Education
                                                           {

                                                               name = StringExtensions.checkNull(edu.Element("name"),""),
                                                               year = StringExtensions.checkNull(edu.Element("year"),""),
                                                               school_type = StringExtensions.checkNull(edu.Element("school_type"),""),
                                                               concentrations = from conc in edu.Descendants("concentrations")
                                                                                where (edu.Element("concentrations").HasElements)
                                                                                select new Concentration
                                                                                {
                                                                                    name = StringExtensions.checkNull(conc.Element("concentration").Value, "")
                                                                                }
                                                           })

                                   }).Take(5)
                                   ;

РЕДАКТИРОВАТЬ: образец XML можно найти здесь: образец XML

Есть еще одна проблема.Название школы не является прямым атрибутом объекта fbUser.Также в xml-файле название школы можно найти только здесь

<user><education_history><education_info><name>

Итак, вот мое утверждение where:

where usr.Element("education_history").Element("education_info").Element(name").value == "schoolname"

Проблема в том, что не всегда есть узел education_history или education_info вXML.

Так что мне также нужен способ обойти это ..

Любая помощь по этой проблеме очень ценится.

Я надеюсь, что вы можете мне помочь!

Grtz

1 Ответ

1 голос
/ 29 марта 2011

Вы имеете в виду заявление where о пользователях, которого нет в вашем образце.Верхний запрос (select new fbUser) выполняет выборку для всех пользователей.Если вы хотите отфильтровать свой список пользователей, вам нужно вставить оператор where между from и select, например так:

    var user = (from usr in doc.Descendants("user")
            where usr.Element("education_history") != null
                && usr.Element("education_info").Element(name") != null
                && usr.Element("education_info").Element(name").value == "schoolname"

            select new fbUser
            {
                //...
            }

Кроме того, распространенное заблуждение, допущенное при передаче запросов данныхв LinQ заключается в том, что в результате запроса LinQ должен быть один оператор, который не должен быть.В вашем случае запрос не будет выполнен, пока вы не воспользуетесь оператором Take(5).Поэтому, если у вас возникли проблемы с построением вашего оператора where, вы можете отложить его до тех пор, пока не создадите часть select:

var query = (from usr in doc.Descendants("user")
             select new fbUser
                   //...

var user = query.where(u => 
    u.Element("education_history") != null
        && u.Element("education_info").Element(name") != null
        && u.Element("education_info").Element(name").value == "schoolname"
).Take(5);
...