2

我正在尝试处理来自 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 标签.. :)

4

3 回答 3

6

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 方法。

于 2011-08-12T00:31:14.643 回答
2

呵呵,简单的回答。我使用的是https://github.com/markrendle/Simple.Data/downloads的最新版本,但实际上它应该从 nuget http://nuget.org/List/Packages/Simple.Data.Core安装。 (

于 2011-05-25T11:56:34.457 回答
1

看来您需要using System.Linq;声明。

如果实际的错误消息包含单词“object”,那么它表明codes从您的调用返回的类型是一个对象,而不是System.Linq.Enumerable.WhereSelectListIterator<System.Collections.Generic.IDictionary<string,object>,Simple.Data.DynamicRecord>}您所说的 a,这将是错误的原因。

于 2011-05-25T11:07:29.170 回答