Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将datatable转换为相应的;命名为;及;“打字”;智能感知的IEnumerable_C#_Vb.net_Linq_Reflection_Lambda - Fatal编程技术网

C# 如何将datatable转换为相应的;命名为;及;“打字”;智能感知的IEnumerable

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

可能是一个dup,但我在发布之前尝试过谷歌搜索

假设有两列的表

年龄(整数)和名称(字符串)

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

现在,要执行任何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
结果现在应该智能感知并显示正确的列名


谢谢你

不行。您需要在编译时了解有关列的信息才能获得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