Положитесь на IEnumerable‹dynamic›

Я использую 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++;
}

person Dave Mateer    schedule 11.10.2011    source источник


Ответы (3)


Вместо того, чтобы вызывать его с использованием синтаксиса члена метода расширения, попробуйте напрямую вызвать статический метод.

int count = Enumerable.Count(queryFromMassiveDynamic);
person Jeff Mercado    schedule 11.10.2011
comment
+1, конечно... метод расширения не будет найден. Меня заинтриговала магия динамического разрешения перегрузок во время выполнения. Кажется, я всегда забываю об этом. - person sehe; 12.10.2011

Вопрос немного не тот. На самом деле вы не считаете IEnumerable<dynamic>. Вы пытаетесь подсчитать число dynamic (которое, надеюсь, содержит число IEnumerable).

Самый простой способ сделать это — использовать приведение типов:

 var z = (queryFromMassiveDynamic as IEnumerable<dynamic>).Count();
person sehe    schedule 11.10.2011

Вы можете взять ответ sehe, который должен привести результат.

var z = (queryFromMassiveDynamic as IEnumerable<dynamic>).Count();

Вместо этого осознайте, что вы получаете от функции-члена Query. На самом деле вы получаете IEnumerable динамического типа, и у var есть проблемы с этим.

Изменить эту строку

var queryFromMassiveDynamic = viewModelExpando.TenTricksNewestFirst;

К этому

IEnumerable<dynamic> queryFromMassiveDynamic = viewModelExpando.TenTricksNewestFirst;

Граф появится без необходимости делать какие-либо кастинги.

person Jake    schedule 18.04.2012