【问题标题】:Dynamically Create DataTable from Nested Class从嵌套类动态创建 DataTable
【发布时间】:2015-04-16 21:45:07
【问题描述】:

我正在尝试在 C# (.NET 3.5) 中从包含一些嵌套类的类中创建 DataTables 的集合。我基本上得到了一个 JSON 对象,将其解析为 RootObject 的集合,然后最终将其加载到 SQL Server 数据库中。我需要为下面的每个类(期望 RootObject)提供一个表,理想情况下,只有 value(?) 属性在数据表中有一个列。

这是我的类的 sn-p(我的实际类有 5-30 个属性):

public class RootObject
{

    [JsonProperty("BaseOrderShipment")]
    public BaseOrderShipment BaseOrderShipment { get; set; }

    [JsonProperty("BaseOrder")]
    public BaseOrder BaseOrder { get; set; }

    [JsonProperty("BaseOrderShipmentLineitem")]
    public IList<BaseOrderShipmentLineitem> BaseOrderShipmentLineitem { get; set; }
}

public class BaseOrderShipment
{

    [JsonProperty("shipment_id")]
    public int ShipmentId { get; set; }

    [JsonProperty("order_id")]
    public int OrderId { get; set; }
}

public class BaseOrder
{

    [JsonProperty("order_id")]
    public int OrderId { get; set; }

    [JsonProperty("ShippingAddress")]
    public ShippingAddress ShippingAddress { get; set; }

    [JsonProperty("BillingAddress")]
    public BillingAddress BillingAddress { get; set; }

    [JsonProperty("Lookup")]
    public IList<Lookup> Lookup { get; set; }
}

public class ShippingAddress
{

    [JsonProperty("ship_address_id")]
    public int ShipAddressId { get; set; }

    [JsonProperty("order_id")]
    public int OrderId { get; set; }

}

public class BillingAddress
{

    [JsonProperty("bill_address_id")]
    public int BillAddressId { get; set; }

    [JsonProperty("order_id")]
    public int OrderId { get; set; }
}

public class Lookup
{

    [JsonProperty("lookup_id")]
    public int LookupId { get; set; }

    [JsonProperty("order_id")]
    public int OrderId { get; set; }
}

public class BaseOrderShipmentLineitem
{

    [JsonProperty("line_item_id")]
    public int LineItemId { get; set; }

    [JsonProperty("order_id")]
    public int OrderId { get; set; }

    [JsonProperty("shipment_id")]
    public int ShipmentId { get; set; }
}

我可以将 JSON 解析为 RootObject 的集合:

var obj = ParseOrderShipments(fileName);

public static IList<RootObject> ParseOrderShipments(string fileName)
{
    List<RootObject> retObj = JsonConvert.DeserializeObject<List<RootObject>>(File.ReadAllText(fileName));

    return retObj;
}

我的第一个想法是遍历 RootObject 类以创建一组空表,然后在我将 JSON 解析为 IList&lt;RootObject&gt; 后填充它们。我的另一个想法是创建DataTable 并立即填充它们。我敢肯定这是有争议的,哪个是更好的方法,所以我愿意接受。

Here's a DotNetFiddle Sample

【问题讨论】:

  • 您可能想看看NHibernateFluent NHibernate。我认为这些软件包可以自动完成您需要做的事情。嗯,当然需要一些设置。
  • 所以为了澄清你想要每个对象的数据表脱离你的根对象?即BaseOrderShipment、BaseOrder、BaseOrderShipmentLineitem

标签: c# .net datatable


【解决方案1】:

这样会创建一个数据表,您可以更改 LINQ 查询以将您需要的属性合并到表中。

        List<RootObject> retObj = new List<RootObject>();

        IEnumerable<DataRow> query =
            (from order in retObj.AsEnumerable()
             select new
             {
                 //alter these to build the additional datatable columns you require
                 order.BaseOrder.OrderId,
                 order.BaseOrder.BillingAddress.BillAddressId,
                 order.BaseOrder.ShippingAddress.ShipAddressId
             })
            as IEnumerable<DataRow>;
        DataTable dtbBaseOrder = query.CopyToDataTable<DataRow>();

【讨论】:

    猜你喜欢
    • 2013-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 2016-09-04
    相关资源
    最近更新 更多