对DataTable对象执行LINQ查询

对DataTable对象执行LINQ查询,linq,datatable,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

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

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;
    }
}
类AllOrders
{
公共静态列表顺序=新列表();
公共静态列表方法=新列表();
公共静态void ProcessTable(DataTable dt)
{
foreach(数据行dr在dt.行中)
{
int sampleId=Convert.ToInt32(dr[“SAMPLE”]);
string methodName=Convert.ToString(dr[“Method”]);
AddOrder(样本ID、方法名称);
}
}
私有静态void AddOrder(int-SampleId,string-methodName)
{
方法m=Methods.FirstOrDefault(x=>x.Name==methodName);
如果(m==null)
{
m=新方法(方法名称);
方法:添加(m);
}
订单o=新订单(样本ID,m);
命令。加入(o);
}
}
阶级秩序
{
公共秩序(整数样本ID,方法m)
{
该方法=m;
this.SampleId=SampleId;
}
public int-SampleId;//更成熟的设计可能会有一个示例类。
公共方法;
}
类方法
{
公共字符串名称;
公共方法(字符串名称)
{
this.Name=Name;
}
}

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;
    }
}
类AllOrders
{
公共静态列表顺序=新列表();
公共静态列表方法=新列表();
公共静态void ProcessTable(DataTable dt)
{
foreach(数据行dr在dt.行中)
{
int sampleId=Convert.ToInt32(dr[“SAMPLE”]);
string methodName=Convert.ToString(dr[“Method”]);
AddOrder(样本ID、方法名称);
}
}
私有静态void AddOrder(int-SampleId,string-methodName)
{
方法m=Methods.FirstOrDefault(x=>x.Name==methodName);
如果(m==null)
{
m=新方法(方法名称);
方法:添加(m);
}
订单o=新订单(样本ID,m);
命令。加入(o);
}
}
阶级秩序
{
公共秩序(整数样本ID,方法m)
{
该方法=m;
this.SampleId=SampleId;
}
public int-SampleId;//更成熟的设计可能会有一个示例类。
公共方法;
}
类方法
{
公共字符串名称;
公共方法(字符串名称)
{
this.Name=Name;
}
}
最好在这种情况下使用(SQL SERVER 2005)

Oracle 11g支持。对于较低版本,您可以看一看,甚至谷歌搜索也会产生很多示例。

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


Oracle 11g支持。对于较低的版本,你可以看一看,甚至谷歌搜索也会产生很多例子。

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

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

@gnomixa这应该仍然有效;只需聚合
SampleId
OrderId
并为每个方法创建一个
方法的集合。你不会有Y/N列,但你真的想要吗?Greg,谢谢你的回答,你的编辑很棒,我会将其标记为已接受,但我最终使用了一个循环,请参见下面的答案。@gnomixa这应该仍然有效;只需聚合
SampleId
OrderId
并为每个方法创建一个
方法的集合。你不会有Y/N列,但你真的想要吗?Greg,谢谢你的回答,你的编辑很棒,我会将其标记为已接受,但我最终使用了循环,请参见下面的答案。