对于动态查询变量,不能解析IQueryable方法

时间:2011-03-04 07:52:15

标签: .net linq dynamic c#-4.0

我正在试图弄清楚如何为使用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'的定义。如何使用动态关键字?

1 个答案:

答案 0 :(得分:10)

你必须使用:

gridUsers.VirtualItemCount = Queryable.Count(query);
gridUsers.DataSource = Enumerable.ToList(query);

动态类型不会“执行”扩展方法。 (我不是完全确定原因。编译器存储了大量关于调用站点的信息 - 它必须存储与调用站点关联的所有using指令,基本上它也会减慢动态绑定速度,这可能是他们试图避免的问题。也许这只是太多的工作而没有太大的好处。)

编辑:出于兴趣,为什么您是否首先尝试使用动态类型为您的序列?我怀疑你会发现这样的各种事情变得更加棘手...... LINQ在很大程度上依赖于各种类型推断。

请注意,拥有IQueryable<dynamic>IEnumerable<dynamic>很好,而且效果会更好。