我有此代码:
List <PhraseAndScore> ps = db2.Query<PhraseAndScore>(select).ToList();
List<PhraseAndScore> psNoHidden = ps.Where(x => x.Hidden == false);
我希望psNoHidden给我ps的内容,但其中Hidden属性为false。当我编译时,给出了这个错误。是因为我做.ToList()太早还是做得正确而应该做其他事情?
错误CS0266:无法隐式转换类型
System.Collections.Generic.IEnumerable<Japanese.PhraseAndScore>
至System.Collections.Generic.List<Japanese.PhraseAndScore>
。一个 存在显式转换(您是否缺少演员表?)(CS0266)
答案 0 :(得分:7)
在ToList()
调用之后添加对Where(...)
方法的调用,例如:ps.Where(x => x.Hidden == false).ToList();
。
Where()
将返回一个IEnumerable
对象,该对象可以是列表,也可以不是列表:编译器不知道它是否为List
,因此会在以下位置引发错误:您。调用ToList()可确保IEnumerable
为您转换为List
。
答案 1 :(得分:3)
在ToList
上调用IQueryable
时,您正在将数据具体化到进程存储器中。您可以使用两种可能的解决方案来解决错误:
List <PhraseAndScore> ps = db2.Query<PhraseAndScore>(select).ToList();
List<PhraseAndScore> psNoHidden = ps.Where(x => x.Hidden == false).ToList();
或
var ps = db2.Query<PhraseAndScore>(select);
List<PhraseAndScore> psNoHidden = ps.Where(x => x.Hidden == false).ToList();
在第二种情况下,您的Where
调用将被转移到数据库并转换为SQL where
子句