如何将数据表转换为Intellisense对应的“named”和“typed”IEnumerable

时间:2012-04-24 17:03:36

标签: c# vb.net linq reflection lambda

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

假设一个包含列

的2列表

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

数据表可以通过简单的dbTable.AsEnumerable()

转换为IEnumerable

现在要执行任何Linq,你必须知道列名,因为由于AsEnumerable返回了一堆你可以枚举的数据行,因此intellisense不会接收它。我使用了一个小的2 col表,但对于有很多列的表来说,这很痛苦。 所以大部分时间我们尝试像

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

现在最后输入结果并按下。 (点)intellisense将在下拉列表中显示名称和年龄。 问题:使用反射查询列名和列类型如何执行类似

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

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

谢谢

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

您可以使用Reflection来构建运行时的类型;然而,在设计时间它将毫无用处,其中智能感知实际发生!


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

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

周围有很多O / R-mappers。因此,我不会在这里提到具体的一个。