C# 如何将datatable转换为相应的;命名为;及;“打字”;智能感知的IEnumerable
可能是一个dup,但我在发布之前尝试过谷歌搜索 假设有两列的表 年龄(整数)和名称(字符串) datatable可以通过简单的dbTable.AsEnumerable()转换为IEnumerable 现在,要执行任何Linq,您必须知道列名,因为intellisense不会获取它,因为AsEnumerable返回了一组您可以枚举的数据行。我使用了一个小的2列表,但对于包含许多列的表来说,这是一个难题。 所以大多数时候我们都会尝试类似的东西C# 如何将datatable转换为相应的;命名为;及;“打字”;智能感知的IEnumerable,c#,vb.net,linq,reflection,lambda,C#,Vb.net,Linq,Reflection,Lambda,可能是一个dup,但我在发布之前尝试过谷歌搜索 假设有两列的表 年龄(整数)和名称(字符串) datatable可以通过简单的dbTable.AsEnumerable()转换为IEnumerable 现在,要执行任何Linq,您必须知道列名,因为intellisense不会获取它,因为AsEnumerable返回了一组您可以枚举的数据行。我使用了一个小的2列表,但对于包含许多列的表来说,这是一个难题。 所以大多数时候我们都会尝试类似的东西 var results = from p in dbTa
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
结果现在应该智能感知并显示正确的列名
谢谢你不行。您需要在编译时了解有关列的信息才能获得intellisense。您可以在运行时创建一个神奇的对象,该对象查看datatable的列并创建属性,但是该对象将没有任何intellisense
如注释中所述,如果将数据存储在特定于该类型的类中,而不是通过datatable,则不会出现此问题。如果没有,您将需要手动将每一行转换为其他类型(无论匿名与否),以从中获取intellisense。您可以使用反射在运行时构建类型;然而,它在设计时将毫无用处,因为intellisense实际上发生在设计时
但是,您可以使用O/R映射器的魔力。O/R映射程序将数据库表映射到类。您使用的不是数据集、表、行和表适配器,而是域对象。使用O/R映射器,您可以这样工作
List<Person> people = dbContext.Query<Person>()
.Where(p => p.Name.StartsWith("A"))
.OrderBy(p => p.Age)
.ToList();
List people=dbContext.Query()
.Where(p=>p.Name.StartsWith(“A”))
.OrderBy(p=>p.Age)
.ToList();
周围有很多O/R映射器。因此,我这里不提及具体的数据表。通过使用自定义类
IEnumerable
而不是使用datatable来绕过所有混乱。有时数据已经在datatable中(数据集包含来自sql server的数据,数据集填充了多个表或结果集。但是,如果可能,请同意我避免使用datatables.Oops。完全忘记了此反射仅在运行时有效。我以前玩过Dapper。我将重新访问O/R mappers.thx