如何将数据表转换为智能感知的相应“命名”和“类型化”IEnumerable

本文关键字:类型化 命名 IEnumerable 数据表 转换 感知 智能 | 更新日期: 2023-09-27 18:32:10

可能是dup,但我在发布之前尝试在这里谷歌搜索和搜索。

假设一个包含列的 2 列表

年龄(整数)和 EmpName(字符串)

数据表可以通过简单的dbTable转换为IEnumerable.AsEnumerable()

现在要执行任何 Linq,您必须知道列名,因为 intellisense 不会选取它,因为 AsEnumerable 返回了一堆可以枚举的数据行。我使用了一个小的 2 列表,但对于具有许多列的表来说,这很痛苦。所以大多数时候我们尝试类似的东西

var results = from p in dbTable.AsEnumerable()
            select new
            {
               name = p.Field<string>("name"),
               age = p.Field<int>("age")
            };

现在终于当我们输入结果并按.(点)智能感知将在下拉列表中显示姓名和年龄。问题:使用反射查询列名和列类型如何执行类似操作

var results = YourMagicRoutine(dbTable);
//You can use lambda etc instead of method call in above line

结果现在应该智能感知并显示正确的列名称

谢谢

如何将数据表转换为智能感知的相应“命名”和“类型化”IEnumerable

您可以使用反射在运行时构造类型;但是,它在设计时将毫无用处,因为智能感知实际上发生了!


但是,您可以使用O/R映射器的魔力。O/R 映射器将数据库表映射到类。您不使用数据集、表、行和表适配器,而是使用域对象。使用O/R映射器,您将像这样工作

List<Person> people = dbContext.Query<Person>()
    .Where(p => p.Name.StartsWith("A"))
    .OrderBy(p => p.Age)
    .ToList();

周围有很多O/R映射器。因此,我在这里不是指特定的。

你不能。 您需要在编译时知道有关列的信息才能获得智能感知。 您可以在运行时创建一个魔术对象,该对象查看数据表的列并创建属性,但随后该对象将没有任何智能感知。

如注释中所述,如果将数据存储在特定于该类型的类中,而不是通过数据表存储,则不会遇到此问题。 如果没有,则需要手动将每一行转换为其他类型(无论是否匿名)以从中获取智能感知。