0

i have the following working code to create a specific formatted XML file from an XML string input.

            var dc = XElement.Parse(InputXml);
            var cd = ContextDate.ToString("yyyyMMdd");

            var xc = XNamespace.Get("XmlCache");
            var mp = XNamespace.Get("mx.MarketParameters");
            var fx = XNamespace.Get("mx.MarketParameters.Forex");
            var fxsp = XNamespace.Get("mx.MarketParameters.Forex.Spot");
            var xdoc = new XDocument(
                new XDeclaration("1.0", "utf-8", "no"),
                new XElement(xc + "XmlCache", new XAttribute(XNamespace.Xmlns + "xc", xc),
                    new XAttribute(XNamespace.Xmlns + "mp", mp),
                    new XAttribute(XNamespace.Xmlns + "fx", fx),
                    new XAttribute(XNamespace.Xmlns + "fxsp", fxsp),
                    new XAttribute(xc + "action", "Update"),
                    new XElement(xc + "XmlCacheArea", new XAttribute(xc + "value", "MarketParameters"),
                        new XElement(mp + "nickName", new XAttribute(XNamespace.Xmlns + "mp", mp),
                            new XAttribute(xc + "value", MpNickName),
                            new XElement(mp + "date",
                                new XAttribute(xc + "value", cd),
                                new XElement(fx + "forex", new XAttribute(XNamespace.Xmlns + "fx", fx),
                                    new XElement(fxsp + "spot",
                                        new XAttribute(XNamespace.Xmlns + "fxsp", fxsp),
                                        from myRow in dc.Elements("row").AsEnumerable()
                                        group myRow by new { ccy = myRow.GetElementValue("Ccy") }
                                        into myGroup
                                        select
                                        new XElement(fxsp + "pair",
                                            new XAttribute(xc + "value", myGroup.Key.ccy),
                                                from myRow in myGroup
                                                select
                                                new XElement(fxsp + "pair",
                                                    new XAttribute(xc + "value", myRow.GetElementValue("Identifier")),
                                                    new XAttribute(xc + "type", "Fields"),
                                                    new XElement(mp + "ask", new XAttribute(xc + "keyFormat", "N"), myRow.GetElementValue("Value")),
                                                    new XElement(mp + "bid", new XAttribute(xc + "keyFormat", "N"), myRow.GetElementValue("Value")),
                                                    new XElement(mp + "mid", new XAttribute(xc + "keyFormat", "N"), myRow.GetElementValue("Value")),
                                                    new XElement(mp + "quotation", new XAttribute(xc + "keyFormat", "C"),
                                                        myRow.GetElementValue("Identifier")))))))))));

But now i need to do a self join on the table to combine 2 rows to 1. The table contains 2 different ProductTypes which need to be joined by the Identifier column. So i use myRow for type A and shiftRow for type B I need to have the value of both Value columns in one row. To overcome the ambiguous column names i read i need to use join into as stated here LINQ to SQL: How to handle ambiguous column names when joining tables? But i cannot use a 'select new {t1A = t1.ColumnA, t2A = t2.ColumnA, t3A = t3.ColumnA }' as suggested inside my LINQ to XML. I tried below but it won't compile with commented line uncommented.

            xdoc = new XDocument(
                new XDeclaration("1.0", "utf-8", "no"),
                new XElement(xc + "XmlCache", new XAttribute(XNamespace.Xmlns + "xc", xc),
                    new XAttribute(XNamespace.Xmlns + "mp", mp),
                    new XAttribute(XNamespace.Xmlns + "fx", fx),
                    new XAttribute(XNamespace.Xmlns + "fxsp", fxsp),
                    new XAttribute(xc + "action", "Update"),
                    new XElement(xc + "XmlCacheArea", new XAttribute(xc + "value", "MarketParameters"),
                        new XElement(mp + "nickName", new XAttribute(XNamespace.Xmlns + "mp", mp),
                            new XAttribute(xc + "value", MpNickName),
                            new XElement(mp + "date",
                                new XAttribute(xc + "value", cd),
                                new XElement(fx + "forex", new XAttribute(XNamespace.Xmlns + "fx", fx),
                                    new XElement(fxsp + "spot",
                                        new XAttribute(XNamespace.Xmlns + "fxsp", fxsp),

                                        from myRow in
                                        dc.Elements("row").AsEnumerable().Where(x => x.GetElementValue("ProductType").Equals("A"))
                                        join shiftRow in
                                        dc.Elements("row").AsEnumerable().Where(x => x.GetElementValue("ProductType").Equals("B")) on
                                        myRow.GetElementValue("Identifier") equals shiftRow.GetElementValue("Identifier")
                                        into joined
                                        from shiftRow in joined.DefaultIfEmpty()

                                        //new { t1A = myRow.GetElementValue("Value"), t2A = shiftRow.GetElementValue("Value") }

                                        group myRow by new { ccy = myRow.GetElementValue("Ccy") }
                                        into myGroup
                                        select
                                        new XElement(fxsp + "pair",
                                            new XAttribute(xc + "value", myGroup.Key.ccy),
                                                from myRow in myGroup
                                                select
                                                new XElement(fxsp + "pair",
                                                    new XAttribute(xc + "value", myRow.GetElementValue("Identifier")),
                                                    new XAttribute(xc + "type", "Fields"),
                                                    new XElement(mp + "ask", new XAttribute(xc + "keyFormat", "N"), myRow.GetElementValue("Value")),
                                                    new XElement(mp + "bid", new XAttribute(xc + "keyFormat", "N"), myRow.GetElementValue("Value")),
                                                    new XElement(mp + "mid", new XAttribute(xc + "keyFormat", "N"), myRow.GetElementValue("Value")),
                                                    new XElement(mp + "quotation", new XAttribute(xc + "keyFormat", "C"),
                                                        myRow.GetElementValue("Identifier")))))))))));

how to solve? i need to use the value of shiftRow after the group into clause which makes shiftRow not accessible anymore. Sorry for the lengthy code...

Eddict
  • 43
  • 7
  • 4
    Why do you need on gigantic statement? Break it up into smaller pieces the you can easily work with. – jdweng Sep 15 '17 at 16:26
  • I'm going to suggest you [edit] your question to try to boil that down into a [mcve] -- with an emphasis on **minimal**. First, please include sample input XML we can use for testing. Second, remove all the code other than what is necessary to demonstrate your difficulty in generating the joined list of elements. If we can copy your non-working code into a console app and test it ourselves, we're more likely to be able to give you an answer. – dbc Sep 15 '17 at 17:32

0 Answers0