【问题标题】:IQueryable methods are not resolved for dynamic query variable动态查询变量无法解析 IQueryable 方法
【发布时间】:2011-07-08 15:30:33
【问题描述】:

我试图弄清楚如何为我的使用 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();
}

错误是:“对象”不包含“计数”的定义。如何让它与动态关键字一起使用?

【问题讨论】:

    标签: .net linq dynamic c#-4.0


    【解决方案1】:

    你必须使用:

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

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

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

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

    【讨论】:

    • 有趣的(也许)认为 - 需要隐藏 using 也可能会干扰静默的未使用引用删除......而且有些人可能会抱怨(也许是不合理的)它泄漏了代码信息。
    • @Marc:关于未使用的引用删除的有趣点,是的。哎呀。很高兴我不必经常使用dynamic :)
    • 是的,这是我从未真正使用过的最大功能......我想我/我们不属于目标群体......
    猜你喜欢
    • 1970-01-01
    • 2020-04-10
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多