开发者

IQueryable methods are not resolved for dynamic query variable

开发者 https://www.devze.com 2023-02-14 14:47 出处:网络
I\'m trying to figure out how to use dynamic variable开发者_运维技巧s for my methods that use LINQ queries. For example, that works fine:

I'm trying to figure out how to use dynamic variable开发者_运维技巧s for my methods that use LINQ queries. For example, that works fine:

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();
}

But this doesn't work:

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();
}

The error is: 'object' does not contain a definition for 'Count'. How can I get it working with dynamic keyword?


You'd have to use:

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

Dynamic typing doesn't "do" extension methods. (I'm not completely sure why. The compiler stashes a fair amount of information about the call site - it would have to store all the using directives associated with the call site too, basically. It would also slow down dynamic binding, which may be the problem they're trying to avoid. Maybe it was just too much work for too little benefit.)

EDIT: Just out of interest, why are you trying to use dynamic typing for your sequence in the first place? I suspect you'll find all kinds of things like this become trickier... LINQ depends quite heavily on various bits of type inference.

Note that having an IQueryable<dynamic> or an IEnumerable<dynamic> is fine, and will work rather better.

0

精彩评论

暂无评论...
验证码 换一张
取 消