0

可能是一个重复,但我在发布之前尝试使用谷歌搜索和搜索。

假设一个包含列的 2 列表

年龄(int)和 EmpName(字符串)

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

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

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

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

谢谢你

4

2 回答 2

1

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

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

于 2012-04-24T17:09:34.573 回答
1

您可以使用反射在运行时构造类型;但是,它在设计时没有用,智能感知实际上发生在设计时!


但是,您可以使用 O/R 映射器的魔力。O/R-mappers 将数据库表映射到类。您无需使用 DataSet、Tables、Rows 和 TableAdapter,而是使用域对象。使用 O/R-mapper 你会像这样工作

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

周围有很多 O/R 映射器。因此,我在这里不指具体的一个。

于 2012-04-24T17:11:57.640 回答