我正在尝试从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>}
。
我错过了什么?有人添加一个simple.data标签,请:..)
答案 0 :(得分:6)
LINQ方法对db.Code.All()返回的对象不起作用的主要原因是,在代码中的那一点,C#编译器不知道它是IEnumerable,所以它可以' t挂钩扩展方法。当然,C#编译器不知道对象是什么,因为它是动态的,所以它会传递它并假设在运行时将解析First()方法。
我试图在最近的版本中解决这个问题,并且支持许多方法,包括ToList,First,FirstOrDefault,Single,SingleOrDefault和其他一些方法。还有更多内容即将推出(在0.9.x版本内)。
使编译器恢复完全生效的最简单方法是显式指定类型而不是使用var。例如
IEnumerable<Code> codes = db.Codes.All();
将导致从SimpleQuery类型到IEnumerable类型的“隐式强制转换”(引用因为它不是真的,但它就像一个),此时你可以再次开始使用LINQ方法。
答案 1 :(得分:2)
答案 2 :(得分:1)
您似乎需要using System.Linq;
声明。
如果实际的错误消息包含单词'object',那么它表示从您的调用返回的codes
类型是一个对象,而不是您所说的System.Linq.Enumerable.WhereSelectListIterator<System.Collections.Generic.IDictionary<string,object>,Simple.Data.DynamicRecord>}
,这可能是原因错误。