Jag tycker det här med LINQ är ganska kul... Kan inte direkt hjälpa dig. men kan direkt säga. Wooo shit det är sådan här kod i alla fall jag försöker få folk att undvika skriva med LINQ under alla de seminarier jag hållt. Av många skäl. Det finns en rätt bra dimecast om Linq to Xml. Kolla på den och se om det är något för dig: Ok... Jag är med på vad du menar.. Johan! Ok. Löst det.LINQ to XML
Däremot...så har jag ett problem. Och det är när man skall skapa en samling entiteter från ett xml-ark.
Här är min kod.
var Family = from input in FamilyResponse.Descendants(xnops + "patent-family")
select new Entities.PatentFamily
{
//PatentFamily har en property "List<FamilyMember> FamilyMembers"
FamilyMembers =
{
from fm in input.Descendants(xnops + "family-member")
select new Entities.FamilyMember
{
//FamilyMember har en property "List<Document> Documents"
Documents =
{
from doc in fm.Descendants("document-id")
where doc.Parent.Attribute("data-format").Value == "docdb"
select new Entities.Document
{
//Document har följande egenskaper som jag försöker sätta:
ReferenceType = doc.Parent.Name.LocalName,
Country = doc.Element("country").Value,
DocNumber = doc.Element("doc-number").Value,
Kind = doc.Element("kind").Value
}
}
}
}
};
Jag får en del kompileringsfel med ovan. Problemet består ju tror jag i att jag vill ha tag i under-egenskaper. (För att behålla referensen av vilka dokument som hör till vilka familjer)
//Fredrik L
Sv: LINQ to XML
För det första så blir koden stor och svårtläst. Det är jobbigt att både läsa och förstå vad du vill komma åt utan att behöva grotta för länge i alla select i alla projections du gör m.m. Tror även det är lite här du även skapar ditt problem.
Jag säger inte att det är bättre att göra på annat sätt, men tror det kommer bli både lättare för dig och även andra att ev justera och uppdatera din kod om du gör mindre anrop fast fler gånger istället och sen fyller till family objekt med rätt saker.
Ex. Först. Hämta ut det första du vill ha.
Sen hämtar du ut det andra du vill ha från ev det första och så vidare. Men inte i nestlad kod.
Dvs.
var något = Select någotFoo ...
var detAndraNågot = select detAndraNågotFoo from något...
var detTredjeNågot = select detTredjeNågotFoo ...
var family = new { A = något, B = setAndreNågot, C = detredjeNågot... }
OBS! min kod är bara pseudo så namnen skall ju självklart vara mer självbrskrivande... Men ville bara demostrera min tanke.
Jag tror detta kan hjälpa dig. För att göra det ännu snyggare kan man faktiskt göra metoder för varjhe select med beskrivande namn vad man hämtar ut.
public något GetNågot()
{
var något = select foo from ....
return ...
}
Mvh JohanSv: LINQ to XML
http://www.dimecasts.net/Casts/CastFeedDetails/36Sv:LINQ to XML
Skall prova den här approchen och se om jag kommer närmare det jag söker.
Filmen som postades här innan var kanon den oxå! :)
//Fredrik LSv: LINQ to XML
Verkligen ett kanon tips.. Tror poletten i hur man skall använda Linq to XML nu.
Jag skrev om koden i första inlägget till detta:
string DocumentType = string.Empty;
string DataFormat = string.Empty;
var Family = from doc in FamilyResponse.Descendants(xnops + "patent-family")
select doc;
var FamilyMembers = from fm in Family.Descendants(xnops + "family-member")
select fm;
var Documents = from fmDocs in FamilyMembers.Descendants()
select fmDocs;
Entities.PatentFamily newFamily = new Entities.PatentFamily();
foreach (var thisFamily in FamilyMembers)
{
Entities.FamilyMember newMember = new Entities.FamilyMember();
foreach (var Doc in Documents)
{
Entities.Document newDoc = new Entities.Document();
DocumentType = Documents.ElementAt(0).Name.LocalName;
DataFormat = Documents.ElementAt(0).Attribute("data-format").Value;
newDoc.ReferenceType = DocumentType;
//På raden under här sker NullReferenceExeption. Varför då?
newMember.Documents.Add(newDoc);
}
newFamily.FamilyMembers.Add(newMember);
}
Koden ovan fungerar mycket bra förutom när jag försöker lägga till ett objekt. (objektet är satt med ett värde på "ReferenceType", men ändå vill den inte lägga till objektet i listan.. Hur kommer detta sig? Vad har jag missat?
//Fredrik L
Sv:LINQ to XML
Problemet var iaf. att jag ju bara hade auto-properies för listpropertys i de olika klasser.
Så.. jag skapade en "lägg till"-metod i de olika klasserna som jag anropade när jag skulle lägga till nya objekt i listan. Metoden initierar listan ifall den är null.
//Fredrik L.