2010-12-22 118 views
0

假设我有一个DataTable对象与来自数据库的数据,我需要重新组织它。我认为(根据我的研究)LINQ将是一个优雅的(但速度很快?)的方式。问题是如何。在DataTable对象上执行LINQ查询

的数据来自于数据库的格式如下

ORDER SAMPLE METHOD  

1234 1  ASH-10   
1234 1  ASH-11 
1234 1  ASH-12 
1234 2  ASH-10  
1234 2  ASh-12 
1234 5  ASH-10 
1235 1  BSH-10 
1235 1  BSH-11 
1235 1  BSH-12 

我需要它来重新洗牌作为

ORDER SAMPLE ASH-10 ASH-11 ASH-12 BSH-10 BSH-11 BSH-12 
1234 1  Y  Y  Y  N  N N 
1234 2  Y  N  Y  N  N N 
1234 5  Y  N  N  N  N N 
1235 1  N  N  N  N  Y Y 

正如你所看到的方法列将是动态的。当然,我可以使用旧式循环来循环数据,但是看起来LINQ似乎是更好更快的方式。纠正我,如果我错了。

回答

2

DataTable非常适合从数据库检索数据到应用程序中,但一旦拥有了数据,通常最好将其转换为自定义对象。

你的初步设计可能是这样的:

class AllOrders 
{ 
    public static List<Order> Orders = new List<Order>(); 
    public static List<Method> Methods = new List<Method>(); 

    public static void ProcessTable(DataTable dt) 
    { 
     foreach (DataRow dr in dt.Rows) 
     { 
      int sampleId = Convert.ToInt32(dr["SAMPLE"]); 
      string methodName = Convert.ToString(dr["Method"]); 
      AddOrder(sampleId, methodName); 
     } 
    } 

    private static void AddOrder(int SampleId, string methodName) 
    { 
     Method m = Methods.FirstOrDefault(x => x.Name == methodName); 
     if (m == null) 
     { 
      m = new Method(methodName); 
      Methods.Add(m); 
     } 
     Order o = new Order(SampleId, m); 
     Orders.Add(o); 
    } 
} 

class Order 
{ 
    public Order(int sampleId, Method m) 
    { 
     this.Method = m; 
     this.SampleId = sampleId; 
    } 
    public int SampleId; //a more mature design might have a Sample class instead. 
    public Method Method; 

} 

class Method 
{ 
    public string Name; 
    public Method(string name) 
    { 
     this.Name = name; 
    } 
} 
+0

@gnomixa这应该仍然有效;只是在`SampleId`和`OrderId`上聚合并为每个``创建一个`Method`的集合。你不会有Y/N列,但是你真的想要那些吗? – 2010-12-22 02:35:38

+0

格雷格,谢谢你的回答,你的编辑很棒,我会将其标记为已接受,但我最终会使用循环,请参阅下面的答案。 – sarsnake 2010-12-22 18:11:40

0

最好是在这种情况下(SQL SERVER 2005)使用Dynamic Pivoting

Oracle 11g支持Pivoting。对于较低版本,你可以看看thisthis甚至谷歌搜索将产生大量的例子。

1

我最终使用循环来迭代和排序数据。填充对象的方法在这里有点多余 - 它是一个Web服务,所以我需要的只是对数据进行排序并将其返回。所以我保持简单。