/ / Podmienečne Linq to XML select (vnorené príkazy select) - xml, linq, facebook, select, facebook-fql

Podmienené odkazy Linq na XML (vnorené výberové príkazy) - xml, linq, facebook, select, facebook-fql

Snažím sa pozrieť všetkých svojich priateľov z facebookuktorý šiel do nejakej školy. Používam FQL na získanie xml súboru, ktorý obsahuje všetkých svojich priateľov so svojimi vzdelávacími informáciami. Ale nemôžem použiť FQL na výber len tých, ktorí šli do tej istej školy, a preto sa pokúšam používať Linq na XML, aby som si vybral iba tých, ktorých chcem. Snažil som sa niektoré metódy, ale tieto nebudú pracovať pre mňa.

Tu je môj dotaz 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)
;

EDIT: vzorka xml nájdete tu:vzorový XML

Je tu ešte jeden problém: názov školy nie je priamym atribútom objektu fbUser a tiež v xml súbore sa nachádza iba názov školy

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

Takže tu je moje vyhlásenie:

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

Problém je v tom, že v XML nie je vždy uzol education_history alebo education_info.

Takže potrebujem aj spôsob, ako to zvládnuť ..

Akákoľvek pomoc na tento problém je veľmi cenená.

Dúfam, že mi môžete pomôcť!

Grtz

odpovede:

1 pre odpoveď č. 1

Máte na mysli a where vyhlásenie o používateľoch, ktoré nie je vo vašej vzorke. Najvyšší dotaz (select new fbUser) vykonáva výber pre všetkých používateľov. Ak chcete filtrovať zoznam používateľov, musíte vložiť znak a where vyhlásenie medzi from a select, ako toto:

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

Tiež bežná mylná predstava, kedyprekladanie dátových dopytov do LinQ je to, že výsledný dotaz LinQ by mal byť jediný príkaz, ktorý nemusí byť. Vo vašom prípade dotaz nie je vykonaný, kým nepoužijete Take(5) vyhlásenia. Takže ak máte problémy s budovaním vášho where môžete ju odložiť až po vytvorení select časť:

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