var allUsers = (from u in dataSource select u).AsQueryable<User>().Select("new(Id as myId, Grade)");因为只是获取了部分属性,allUsers获取后是一个dynamic class {Id=1, Grade=2}的集合。怎么遍历这个集合?foreach(var user in allUsers)
{
int id = user.Id; //保持,提示object类型没有Id属性
}
{
int id = user.Id; //保持,提示object类型没有Id属性
}
{
int id = user.Id; //保持,提示object类型没有Id属性
}
dynamic不会在编译期对访问的成员做检查,object不是弱类型,它是所有类型的基类。使用object,只能反射,可以认为,dynamic简化了反射的写法。
貌似是dynamic linq一类的语法。
貌似是dynamic linq一类的语法。这是微软在Linq后又写了一个扩展,Linq Dynamic Query Libry. 能够通过拼接字符串的形式查询,而不仅仅局限于使用q=>q.Id形式。
dynamic不会在编译期对访问的成员做检查,object不是弱类型,它是所有类型的基类。使用object,只能反射,可以认为,dynamic简化了反射的写法。var 类型会在编译的时候做检查吗? 如果是的话,var user in allUsers中的user是什么类型呢?我发现并不是我定义的User类型,而是什么LinqDynamic.User类型。 这是怎么回事?谢谢。
dynamic不会在编译期对访问的成员做检查,object不是弱类型,它是所有类型的基类。使用object,只能反射,可以认为,dynamic简化了反射的写法。var 类型会在编译的时候做检查吗? 如果是的话,var user in allUsers中的user是什么类型呢?我发现并不是我定义的User类型,而是什么LinqDynamic.User类型。 这是怎么回事?谢谢。var会做语法检查。
var x = new { id = 1 };
此时x是一个匿名类型的对象,这个匿名类型是C#编译器产生的,并且在IL中就存在,也就是对于CLR来说,这个类型是确定的,和你定义一个类一样。
Response.WriteLine(user.GetType().ToString()); 看到这个类型的名字。
既然是LinqDynamic.User类型,应该不可以直接访问成员的
你ToArray()或ToList()试一下是不是可以转成匿名类型
foreach(var user in allUsers.ToList())
{
int id = user.Id; //保持,提示object类型没有Id属性
}