我正在试图弄清楚如何为使用LINQ查询的方法使用动态变量。例如,这很好用:
using (DBDataContext db = new DBDataContext())
{
var query = from c in db.Users
select
new
{
c.Firstname,
c.Lastname,
c.Age
};
gridUsers.VirtualItemCount = query.Count();
gridUsers.DataSource = query.ToList();
}
但这不起作用:
using (DBDataContext db = new DBDataContext())
{
dynamic query = from c in db.Users
select
new
{
c.Firstname,
c.Lastname,
c.Age
};
gridUsers.VirtualItemCount = query.Count();
gridUsers.DataSource = query.ToList();
}
错误是:'object'不包含'Count'的定义。如何使用动态关键字?
答案 0 :(得分:10)
你必须使用:
gridUsers.VirtualItemCount = Queryable.Count(query);
gridUsers.DataSource = Enumerable.ToList(query);
动态类型不会“执行”扩展方法。 (我不是完全确定原因。编译器存储了大量关于调用站点的信息 - 它必须存储与调用站点关联的所有using
指令,基本上它也会减慢动态绑定速度,这可能是他们试图避免的问题。也许这只是太多的工作而没有太大的好处。)
编辑:出于兴趣,为什么您是否首先尝试使用动态类型为您的序列?我怀疑你会发现这样的各种事情变得更加棘手...... LINQ在很大程度上依赖于各种类型推断。
请注意,拥有IQueryable<dynamic>
或IEnumerable<dynamic>
很好,而且效果会更好。