我正在c#中的datatable
上运行LINQ查询。
我想选择特定列而不是整行,并将结果输入datatable
。我怎么能这样做?
我的代码:
public DataTable getConversions(string c_to, string p_to)
{
var query = from r in matrix.AsEnumerable()
where r.Field<string>("c_to") == c_to &&
r.Field<string>("p_to") == p_to
select r;
DataTable conversions = query.CopyToDataTable();
答案 0 :(得分:10)
如果您事先已经知道新DataTable会有多少列,您可以这样做:
DataTable matrix = ... // get matrix values from db
DataTable newDataTable = new DataTable();
newDataTable.Columns.Add("c_to", typeof(string));
newDataTable.Columns.Add("p_to", typeof(string));
var query = from r in matrix.AsEnumerable()
where r.Field<string>("c_to") == "foo" &&
r.Field<string>("p_to") == "bar"
let objectArray = new object[]
{
r.Field<string>("c_to"), r.Field<string>("p_to")
}
select objectArray;
foreach (var array in query)
{
newDataTable.Rows.Add(array);
}
答案 1 :(得分:8)
这里我只从mainDataTable获取三个特定列并使用过滤器
DataTable checkedParams = mainDataTable.Select("checked = true").CopyToDataTable()
.DefaultView.ToTable(false, "lagerID", "reservePeriod", "discount");
答案 2 :(得分:6)
尝试Access DataTable easiest way,它可以帮助您获得使用Linq访问DataTable,DataSet的完美创意......
请考虑以下示例,假设我们有 DataTable ,如下所示。
DataTable ObjDt = new DataTable("List");
ObjDt.Columns.Add("WorkName", typeof(string));
ObjDt.Columns.Add("Price", typeof(decimal));
ObjDt.Columns.Add("Area", typeof(string));
ObjDt.Columns.Add("Quantity",typeof(int));
ObjDt.Columns.Add("Breath",typeof(decimal));
ObjDt.Columns.Add("Length",typeof(decimal));
上面是DatTable的代码,这里我们假设这个DataTable中有一些数据可用,我们必须通过处理一些数据来绑定Grid视图,如下所示。
区域 | 数量 | 呼吸 | 长度 | 价格=数量*呼吸*长度
我们必须触发以下查询,这将为我们提供我们想要的确切结果。
var data = ObjDt.AsEnumerable().Select
(r => new
{
Area = r.Field<string>("Area"),
Que = r.Field<int>("Quantity"),
Breath = r.Field<decimal>("Breath"),
Length = r.Field<decimal>("Length"),
totLen = r.Field<int>("Quantity") * (r.Field<decimal>("Breath") * r.Field<decimal>("Length"))
}).ToList();
我们只需将此数据变量指定为数据源。
通过使用这个简单的Linq查询,我们可以获得所有接受,并且我们也可以使用此执行所有其他LINQ查询...
答案 3 :(得分:6)
LINQ非常有效且易于在列表而非DataTable上使用。我可以看到上面的答案有一个循环(for,foreach),我不喜欢。
因此,从DataTable中选择特定列的最佳方法是使用DataView过滤列并根据需要使用它。
在此处查找如何执行此操作。
DataView dtView = new DataView(dtYourDataTable);
DataTable dtTableWithOneColumn= dtView .ToTable(true, "ColumnA");
现在DataTable dtTableWithOneColumn 只包含一列(ColumnA)。
答案 4 :(得分:3)
您的select语句返回一个匿名类型的序列,而不是一系列DataRows。 CopyToDataTable()仅适用于IEnumerable<T>
T
或DataRow
派生的r
。您可以选择var query = from r in matrix.AsEnumerable()
where r.Field<string>("c_to") == c_to &&
r.Field<string>("p_to") == p_to
select r;
DataTable conversions = query.CopyToDataTable();
行对象来调用CopyToDataTable。
{{1}}
您也可以implement CopyToDataTable通用类型T不是DataRow。