使用IEnumerable<dynamic>计数

5
我正在使用Rob Conery的Massive ORM。
有没有一种优雅的方法来对返回的记录集进行计数?
dynamic viewModelExpando = result.ViewData.Model;
var queryFromMassiveDynamic = viewModelExpando.TenTricksNewestFirst;

//fails as have actually got TryInvokeMember on it
var z = queryFromMassiveDynamic.Count();

//works
int i = 0;
foreach (var item in queryFromMassiveDynamic) {
    i++;
}
3个回答

14

不要使用扩展方法的成员语法来调用它,而是尝试直接调用静态方法。

int count = Enumerable.Count(queryFromMassiveDynamic);

当然是+1…扩展方法会找不到。我对动态类型的运行时重载解析感到着迷。我好像总是忘记这个。 - sehe

5
你可以采用sehe的方法,对结果进行强制转换。
var z = (queryFromMassiveDynamic as IEnumerable<dynamic>).Count();

相反,意识到你从Query成员函数获取的内容。实际上,你得到的是类型为dynamic的IEnumerable,而var对这些类型会有困难。

更改此行:

var queryFromMassiveDynamic = viewModelExpando.TenTricksNewestFirst;

对此

IEnumerable<dynamic> queryFromMassiveDynamic = viewModelExpando.TenTricksNewestFirst;

计数将会显示出来,无需进行任何转换。


4
这个问题有点偏离。实际上,你并没有对一个 IEnumerable<dynamic> 进行计数。你是在试图对一个 dynamic 进行计数(希望它包含了一个 IEnumerable)。
直接的解决方法是使用强制类型转换:
 var z = (queryFromMassiveDynamic as IEnumerable<dynamic>).Count();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接