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

the*_*e_V 4 .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();
}
Run Code Online (Sandbox Code Playgroud)

但这不起作用:

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();
}
Run Code Online (Sandbox Code Playgroud)

错误是:'object'不包含'Count'的定义.如何使用动态关键字?

Jon*_*eet 10

你必须使用:

gridUsers.VirtualItemCount = Queryable.Count(query);
gridUsers.DataSource = Enumerable.ToList(query);
Run Code Online (Sandbox Code Playgroud)

动态类型不"做"扩展方法.(我不完全确定原因.编译器存储了大量关于调用站点的信息 - 它using基本上也必须存储与调用站点相关的所有指令.它还会减慢动态绑定,这可能是他们试图避免的问题.也许这只是为了太少的利益而做的太多工作.)

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

注意,有一个IQueryable<dynamic>或一个IEnumerable<dynamic>是好的,并将更好地工作.

  • 有趣(也许)认为 - 隐藏`使用'的需要也可能干扰静默的未使用参考删除...也有些人可能会抱怨(可能是不合理的)它泄漏了代码信息. (2认同)