对DataTable对象执行LINQ查询
假设我有一个包含数据库数据的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
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,谢谢你的回答,你的编辑很棒,我会将其标记为已接受,但我最终使用了循环,请参见下面的答案。