在DataTable对象上执行LINQ查询

时间:2010-12-22 00:56:54

标签: linq datatable

假设我有一个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将是一种更好,更快的方法。如果我错了,请纠正我。

3 个答案:

答案 0 :(得分: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;
    }
}

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

Oracle 11g支持Pivoting。对于较低版本,您可以查看thisthis,甚至谷歌搜索也会产生大量示例。