可能是一个副本但我在发布之前尝试使用谷歌搜索和搜索。
假设一个包含列
的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
结果现在应该智能感知并显示正确的列名
谢谢
答案 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。因此,我不会在这里提到具体的一个。