2014-05-12 51 views
1

我有一個數據表prdData這樣改變的數據表的結構與特定條件

productid  text     linenumber typenumber 
100    this is the     0    2 
100    description of a1   2    2 
200    this is the name of a2  0    0 
100    this is the name of a1  0    0 
200    shortdescription of a2  0    1 

在此表中的產品數據被存儲。產品編號,產品名稱,簡短說明,長描述均爲數據存儲。如typenumber0其名稱,若爲1其簡短說明,並且其爲2其長描述。如果這些數據很長,那麼這些數據可能會出現在不同的行中。每行可以通過linenumber來識別第一行,它將是0下一個2等等。我想將此DataTable轉換爲另一個數據表這樣的

productId name     shortdescription    longdescription 
100   this is the name of a1        this is the description of a1 
200   this is the name of a2 shortdescription of a2 

任何人都可以告訴我怎麼能做到這一點?

+0

到目前爲止,你有嘗試過什麼嗎?爲什麼你需要結果作爲DataTable? –

+0

@SergeyBerezovskiy我已經嘗試過這與Foreach循環已經,但失敗。我的情況比這裏解釋的情況稍微複雜一些。這只是一個原型,這就是爲什麼我沒有在這裏分享代碼。 – Athul

+0

@SergeyBerezovskiy實際上我希望我的XML格式的最終​​結果,如果我在Datatable中解決了這個問題。我很容易將它轉換爲XMLDoc。 – Athul

回答

2

您可以按產品,然後組產品按類型行組行:

var query = from r in table.AsEnumerable() 
      group r by r.Field<int>("productid") into g 
      let types = g.GroupBy(r => r.Field<int>("typenumber")) 
      select new { 
       productId = g.Key, 
       name = GetText(types.FirstOrDefault(t => t.Key == 0)), 
       shortdescription = GetText(types.FirstOrDefault(t => t.Key == 2)), 
       longdescription = GetText(types.FirstOrDefault(t => t.Key == 1)) 
     }; 

當輔助方法,只是訂單輸入行號行並返回串接文本

private static string GetText(IEnumerable<DataRow> rows) 
{ 
    if (rows == null) 
     return null; 

    var query = from r in rows 
       orderby r.Field<int>("linenumber") 
       select r.Field<string>("text"); 

    return String.Join(" ", query);     
} 

輸出:

[ 
    { 
    productId: 100, 
    name: "this is the name of a1", 
    shortdescription: "this is the description of a1", 
    longdescription: null 
    }, 
    { 
    productId: 200, 
    name: "this is the name of a2", 
    shortdescription: null, 
    longdescription: "shortdescription of a2" 
    } 
] 

您可以手動構建新的DataTable或使用此方法創建新的DataTable。你也可以使用LINQ構建以XML爲xml:

var xdoc = new XDocument(new XElement("products", 
       from p in query 
       select new XElement("product", 
        new XAttribute("productId", p.productId), 
        new XElement("name", p.name), 
        new XElement("shortDescription", p.shortdescription), 
        new XElement("longDescription", p.longdescription)))); 

輸出:

<products> 
    <product productId="100"> 
    <name>this is the name of a1</name> 
    <shortDescription>this is the description of a1</shortDescription> 
    <longDescription /> 
    </product> 
    <product productId="200"> 
    <name>this is the name of a2</name> 
    <shortDescription /> 
    <longDescription>shortdescription of a2</longDescription> 
    </product> 
</products> 

或(可能)更簡單的方案 - 而不是匿名類型的使用,創造出可以很容易地序列化爲XML定製類。

+0

感謝您的幫助,它真的解決了我的問題。但是我想知道,如果數據表中有另一列,它是獨立的數字和類型號碼,我怎樣才能在這個代碼中得到它? – Athul

+1

@Athul實際上對於這個網站格式的回答已經很大:)所以如果你想爲這個問題提供詳細的解決方案,最好再問一個問題。但快速解決方案如下 - 如果您擁有獨立的專欄,那麼您應該決定以何種格式從該專欄中獲取數據。因此,分組行將包含與產品相關的所有行,您可以爲給定產品選擇此字段的所有值。或者您可以選擇彙總值 –