Перечисление списка возврата из simple.data - PullRequest
2 голосов
/ 25 мая 2011

Я пытаюсь обработать результаты выбора (Найти .., Все и т. Д.) Из simple.data, но получаю ошибки:

var db = Database.Open();
var codes = db.Code.All();

// 'object' does not contain a definition for 'First'
var firstcode = codes.First();
// 'object' does not contain a definition for 'ToList'
List<Code> codeList = codes.ToList();

Тип codes равен {System.Linq.Enumerable.WhereSelectListIterator<System.Collections.Generic.IDictionary<string,object>,Simple.Data.DynamicRecord>}.

Чего мне не хватает?Кто-нибудь, добавьте тег simple.data, пожалуйста ..:)

Ответы [ 3 ]

6 голосов
/ 12 августа 2011

Основная причина того, что методы LINQ не работают с объектом, возвращаемым из db.Code.All (), заключается в том, что в этот момент в коде компилятор C # не знает, что это IEnumerable, поэтому он может: т подключить методы расширения. Конечно, компилятор C # не знает, что это за объект, потому что он динамический, поэтому он проходит над ним и предполагает, что метод First () будет разрешен во время выполнения.

Я пытался решить эту проблему в более поздних выпусках, и поддерживаются многие методы, включая ToList, First, FirstOrDefault, Single, SingleOrDefault и некоторые другие. Еще больше ожидается в ближайшее время (в релизах 0.9.x).

Самый простой способ вернуть компилятору полный эффект - это явно указать тип вместо использования var. Например

IEnumerable<Code> codes = db.Codes.All();

вызовет «неявное приведение» (заключенное в кавычки, потому что это не совсем так, но оно действует как единое целое) из типа SimpleQuery в тип IEnumerable, после чего вы можете снова начать использовать методы LINQ.

2 голосов
/ 25 мая 2011

Дох, простой ответ. Я использовал последнюю версию https://github.com/markrendle/Simple.Data/downloads, но на самом деле она должна быть установлена ​​из nuget http://nuget.org/List/Packages/Simple.Data.Core..: (

1 голос
/ 25 мая 2011

Похоже, вам нужно объявление using System.Linq;.

Если фактическое сообщение об ошибке содержит слово «объект», то это означает, что тип codes, возвращаемый из вашего вызова, является объектом, а неSystem.Linq.Enumerable.WhereSelectListIterator<System.Collections.Generic.IDictionary<string,object>,Simple.Data.DynamicRecord>}, как вы говорите, что является причиной ошибки.

...