0

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")

4

1 に答える 1

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()
              });

3 番目のバリアントがあります。データベースにビューまたはストアド プロシージャを作成し、それをデータ コンテキストに追加できます。

于 2012-11-25T11:22:40.087 に答える