【问题标题】:Using LINQ to output SQL data from two tables into XML使用 LINQ 将两个表中的 SQL 数据输出到 XML
【发布时间】:2015-12-20 16:53:53
【问题描述】:

我对此很陌生。希望有人可以帮助我建议如何改进代码。

我有两个表,我需要在其中获取 SQL 数据并将其输出为 XML 格式。我正在使用 LINQ 方法。下面是代码的样子。

#region Database XML Methods

private static void CreateDatabaseXml(string path)
{
    tbchrDataContext db = new tbchrDataContext();
    XDocument doc = new XDocument(
        // XML Declaration
        new XDeclaration("1.0", "utf-8", "yes"),
        // XML Root element to 3rd in nest
        new XElement(ns + "WMS",
        new XElement(ns + "Order",
        new XElement(ns + "Header", from a in db.T_ORDER_DETAILs
                                    select new XElement(ns + "RARefNum", a.RARefNum), 
                                    new XElement (ns + "WMSCategory", from b in db.T_ORDER_HEADERs select b.Customer),
                                    new XElement (ns + "CustomerID", from a in db.T_ORDER_DETAILs select a.SupplierName)))) );

    #endregion
    doc.Save(path);
}

下面是 XML 的输出是什么样子的。

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<WMS xmlns="http://blog.cripperz.sg">
  <Order>
    <Header>
      <RARefNum>RASO000001</RARefNum>
      <RARefNum>RASO000001</RARefNum>
      <WMSCategory>ESSVMI</WMSCategory>
      <CustomerID>nVidianVidia</CustomerID>
    </Header>
  </Order>
</WMS>

最终我想实现下面的 XML,从 SQL 中抓取的一些数据来自一个 XML 嵌套/元素中的两个单独的表。

<?xml version="1.0" encoding="utf-8"?>
<WMS>
    <Order>
        <Header>
            <RARefNum>RASO000001</RARefNum>
            <WMSCategory>ESSVMI</WMSCategory>
            <CustomerID>nVidia</CustomerID>
            <CreationDate>2013-12-02 06:29:50</CreationDate>
            <OrderDate>2013-12-02 06:29:50</OrderDate>
            <ExpectedShippedDate>2013-12-02 06:29:50</ExpectedShippedDate>
            <LastShippedDate>2013-12-02 06:29:50</LastShippedDate>
            <CustomerOrderReference>nVidia9338</CustomerOrderReference>
            <CustomerShipmentNo>81475721</CustomerShipmentNo>
            <CustomerSONo>SO982733</CustomerSONo>
            <CustomerInvoiceNo>INV987373</CustomerInvoiceNo>
            <CustomerReference1>nVidia 1</CustomerReference1>
            <CustomerReference2/>
            <WMSReference1>Emp 1</WMSReference1>
            <WMSReference2>Emp 2</WMSReference2>
            <ShipmentNo>IWU997872</ShipmentNo>
            <DocumentNo>KK98764394</DocumentNo>
            <Transportation>
                <Mode>Freight</Mode>
                <VehicleType/>
            </Transportation>
            <Carrier>
                <ID>Fedex</ID>
                <Name>Fedex SG</Name>
                <Address>Changi Singapore</Address>
                <Country/>
                <PostalCode/>
                <Contact>
                    <Sequence/>
                    <Person/>
                    <Email/>
                    <DID/>
                    <Handphone/>
                </Contact>
            </Carrier>
            <Consignee>
                <ID>ABC</ID>
                <Name>ABC Corp</Name>
                <Address>Jurong West, Singapore</Address>
                <Country/>
                <PostalCode/>
                <Contact>
                    <Sequence/>
                    <Person/>
                    <Email/>
                    <DID/>
                    <Handphone/>
                </Contact>
            </Consignee>
            <Containers/>
        </Header>
        <Details>
            <Detail>
                <LineNo>1</LineNo>
                <SKU>SKU0001</SKU>
                <SKUDescription>SKU 0001</SKUDescription>
                <Package>50</Package>
                <OrderedQty>600.000</OrderedQty>
                <PickedQty>600.000</PickedQty>
                <PickedDate>2013-12-02 06:35:09</PickedDate>
                <ShippedQty>600.000</ShippedQty>
                <ShippedDate>2013-12-02 06:35:09</ShippedDate>
                <ManufactoryDate>2013-12-02 06:35:09</ManufactoryDate>
                <ExpiryDate>2014-12-02 06:35:09</ExpiryDate>
                <FIFODate>2013-06-02 06:35:09</FIFODate>
                <CustomerLotRef1>nVidia 2093</CustomerLotRef1>
                <CustomerLotRef2>nVidia 2099</CustomerLotRef2>
                <LineReference1>10</LineReference1>
            </Detail>
            <Detail>
                <LineNo>2</LineNo>
                <SKU>SKU0002</SKU>
                <SKUDescription>SKU 0002</SKUDescription>
                <Package>50</Package>
                <OrderedQty>100.000</OrderedQty>
                <PickedQty>100.000</PickedQty>
                <PickedDate>2013-12-02 06:35:09</PickedDate>
                <ShippedQty>100.000</ShippedQty>
                <ShippedDate>2013-12-02 06:35:09</ShippedDate>
                <ManufactoryDate>2013-12-02 06:35:09</ManufactoryDate>
                <ExpiryDate>2014-12-02 06:35:09</ExpiryDate>
                <FIFODate>2013-06-02 06:35:09</FIFODate>
                <CustomerLotRef1>nVidia 2193</CustomerLotRef1>
                <CustomerLotRef2>nVidia 2199</CustomerLotRef2>
                <LineReference1>10</LineReference1>
            </Detail>
        </Details>
    </Order>
</WMS>

有没有更好的编码方式?

【问题讨论】:

  • @KiroYakuza 不,Programmers.SE 是关于软件开发概念的,例如有关软件开发生命周期的算法、设计模式或问题。请不要在不了解its scope的情况下推荐其他网站。
  • @KiroYakuza:你从哪里听到的?!
  • 好的,@amon,我在正确的地方问这个问题?
  • @CPython 老实说,我不太确定。您要解决的问题究竟是什么?如果您询问如何修改代码以获得第二个输出,那么如果没有更多详细信息,我们将无法回答。如果您的代码已经按预期运行,但您想改进代码风格等,您可能正在寻找代码审查。有一个专门的网站,但我再次不确定这个问题是否适合该网站。我会通过说出他们的名字 3 次来召唤他们,也许有人会帮助我们:Code ReviewCode ReviewCode Review起来!
  • @amon 一次就够了。如果代码有效,那么第一眼看上去就符合 Code Review 的主题。

标签: c# sql-server xml linq


【解决方案1】:
  • 在 sql server 中支持大量的 xml 格式输出。
  • 此查询从两个表中返回一个 xml 文档。也许你正在使用 linq,然后在完成 sql 查询后,执行查询 林克。

    select table1.column1, table2.column2 from table1 inner join table2 on table2.table1_id = table1.Id for xml auto

检查this link

【讨论】:

    【解决方案2】:

    我不知道这是否更好,但我可能会创建一些变量而不是在 xml 中调用 linq。然后就可以直接调用xml文档中的变量了。

    可能是这样的:

     private static void CreateDatabaseXml(string path)
    {
        tbchrDataContext db = new tbchrDataContext();
    
        var rARefNum = db.T_ORDER_DETAILs.Select(i => i.RARefNum).Single();
        var customer = db.T_ORDER_HEADERs.Select(i => i.Customer).Single();
        var supplierName = db.T_ORDER_DETAILs.Select(i => i.SupplierName).Single();
    
        XDocument doc = new XDocument(
            // XML Declaration
            new XDeclaration("1.0", "utf-8", "yes"),
            // XML Root element to 3rd in nest
            new XElement(ns + "WMS",
            new XElement(ns + "Order",
            new XElement(ns + "Header", new XElement(ns + "RARefNum", rARefNum), 
                                        new XElement (ns + "WMSCategory", customer),
                                        new XElement (ns + "CustomerID", supplierName)))) );
    
        #endregion
        doc.Save(path);
    }
    

    【讨论】:

      猜你喜欢
      • 2011-09-21
      • 1970-01-01
      • 2012-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-19
      • 1970-01-01
      相关资源
      最近更新 更多