我想使用Linq按ColumnName动态选择DataTable列,但要使用Field<>我必须明确地将它们强制转换或将所有东西都装入一个对象,这是无效的。
我试过了:
string[] colsNames = new[] { "Colum1", "Colum2" };
DataTable dt = StoredProcedure().Tables[0];
var cols = dt.Columns.Cast<DataColumn>().Where(c => cols.Contains(c.ColumnName));
if (cols.Any())
{
dt.AsEnumerable().Select(r => string.Join(":", cols.Select(c => r.Field<c.DataType>(c.ColumnName))))
}
但这会引发错误The type or namespace name 'c' could not be found
如何将typeof(decimal)
转换为Field<decimal>("Column1")
?
答案 0 :(得分:0)
试试这个:
DataTable dt = new DataTable();
dt.Columns.Add("id", Type.GetType("System.Int32"));
dt.Columns.Add("Colum1", Type.GetType("System.Int32"));
dt.Columns.Add("Colum2", Type.GetType("System.String"));
dt.Columns.Add("Colum3");
string[] colsNames = new[] { "Colum1", "Colum2" };
var colTypes = dt.Columns.Cast<DataColumn>()
.Where(c => colsNames.Contains(c.ColumnName))
.Select(c => new
{
c.ColumnName,
c.DataType
})
.ToDictionary(key => key.ColumnName, val => val.DataType);
var query = dt.AsEnumerable()
.Where(row => (int)row["id"]==5)
.Select(row => new
{
Colum1 = Convert.ChangeType(row[colsNames[0]], colTypes[colsNames[0]]),
Colum2 = Convert.ChangeType(row[colsNames[1]], colTypes[colsNames[1]])
});
这是另一种变体,但它不是很有趣:
//define class
public class myClass
{
public int Column1;
public string Column2;
}
// then
var query = dt.AsEnumerable()
.Select(row => new myClass
{
Column1 = Convert.ToInt32(row[colsNames[0]]),
Column2 = row[colsNames[1]].ToString()
});
还有第三种变体:您可以在数据库中创建视图或存储过程并将其添加到数据上下文