反转typeof以使用Linq Field< T> [英] Reversing typeof to use Linq Field<T>

查看:66
本文介绍了反转typeof以使用Linq Field< T>的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想使用Linq通过ColumnName动态选择DataTable列,但要使用Field<>我必须显式地将它们强制转换或将所有内容装箱到一个对象,这效率不高.

I want to use Linq to dynamically select DataTable columns by ColumnName but to use Field<> I must explicitly cast them or box everything to an object, which is not efficient.

我尝试过:

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

推荐答案

尝试一下:

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

这是另一种变体,但不是很有趣:

Here is another variant, but it is not very interesting:

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

还有第三种变体:您可以在数据库中创建视图或存储过程,并将其添加到数据上下文中

There is a third variant: you can create a view or stored procedure in the database and add it to the data context

这篇关于反转typeof以使用Linq Field&lt; T&gt;的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆