我正试图处理simple.data中select(Find..、All等)的结果,但我遇到了错误:
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>}
。
我错过了什么?有人添加一个简单的.data标签,请..:)
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方法。
Doh,简单答案。我使用的是https://github.com/markrendle/Simple.Data/downloads但实际上它应该从nuget安装http://nuget.org/List/Packages/Simple.Data.Core..:(
看起来您需要一个using System.Linq;
声明。
如果实际的错误消息包含单词"object",那么它表明从您的调用返回的codes
类型是一个对象,而不是您所说的System.Linq.Enumerable.WhereSelectListIterator<System.Collections.Generic.IDictionary<string,object>,Simple.Data.DynamicRecord>}
,这将是导致错误的原因。