/ / Warunkowe Linq do wyboru XML (zagnieżdżone instrukcje wyboru) - xml, linq, facebook, select, facebook-fql

Warunkowe Linq do wyboru XML (zagnieżdżone instrukcje wyboru) - xml, linq, facebook, select, facebook-fql

Próbuję zobaczyć wszystkich moich znajomych z Facebookaktóry poszedł do jakiejś szkoły. Używam FQL, aby uzyskać plik xml, który zawiera wszystkich moich znajomych z ich informacjami edukacyjnymi. Ale nie mogę użyć FQL, aby wybrać tylko tych, którzy poszli do tej samej szkoły. Dlatego próbuję użyć Linq do XML, aby wybrać tylko tych, których potrzebuję. Wypróbowałem kilka metod, ale te, które mi się nie przydadzą, działają dla mnie.

Oto moje zapytanie 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)
;

EDYCJA: przykładowy plik xml można znaleźć tutaj:przykładowy XML

Jest jeszcze jeden problem: nazwa szkoły nie jest bezpośrednim atrybutem obiektu fbUser. Również w pliku xml nazwa szkoły może być tylko tutaj

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

Oto moje zdanie:

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

Problem polega na tym, że nie ma zawsze węzła education_history lub education_info w xml.

Potrzebuję również sposobu, aby obejść to ...

Każda pomoc w tym problemie jest bardzo doceniana.

Mam nadzieję że możesz mi pomóc!

Grtz

Odpowiedzi:

1 dla odpowiedzi № 1

Odwołujesz się do a where oświadczenie dotyczące użytkowników, którego nie ma w twojej próbce. Najlepsze zapytanie (select new fbUser) wykonuje wybór dla wszystkich użytkowników. Jeśli chcesz filtrować listę użytkowników, musisz wstawić znak where oświadczenie między from i select, lubię to:

    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
{
//...
}

Powszechne nieporozumienie popełniono, gdyprzetwarzanie kwerend danych w LinQ jest to, że wynikowe zapytanie LinQ powinno być pojedynczą instrukcją, której nie musi być. W twoim przypadku zapytanie nie zostanie wykonane dopóki nie użyjesz Take(5) komunikat. Więc jeśli masz problemy ze skonstruowaniem swojego where oświadczenie, możesz odłożyć je do momentu, aż utworzysz select część:

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);