我正在根据用户的表单输入构建linq查询。我有一个视图,希望IList类型为“trace”。
这种方法可能完全错误,但我在下面的代码中遇到以下错误
错误7无法将类型'System.Collections.Generic.IEnumerable'隐式转换为'System.Collections.Generic.IList'。存在显式转换(您是否错过了演员?)
我不明白这一点,因为我从未在第一步中将痕迹列为可枚举。
最终,我只想查询trace实体并将列表返回给视图。
IList<trace> traces = new List<trace>();
//by users
if (form["reps"] != null)
{
List<string> reps = new List<string>(form["reps"].Split(','));
traces = traces.Where(s => reps.Contains(s.repslist));
}
//by start date
if (!String.IsNullOrWhiteSpace(form["homefrom"]))
{
DateTime sdate = Convert.ToDateTime(form["homefrom"]);
traces = traces.Where(t => t.tracedate >= sdate);
}
return PartialView("_tracescontainer", traces);
修改
我尝试了以下内容 - 所有内容都编译,没有错误,在Google检查器中,帖子显示待处理而没有错误。我等了大约10分钟。调试时,我逐步完成,步骤永远不会到达IList tracelist = traces.ToList();
没有错误,它只是在断点之外就像操作完成一样,但没有结果发送到浏览器。
IEnumerable<trace> traces = db.traces;
//by users
if (form["reps"] != null)
{
List<string> reps = new List<string>(form["reps"].Split(','));
traces = traces.Where(s => reps.Contains(s.repslist));
}
//by start date
if (!String.IsNullOrWhiteSpace(form["homefrom"]))
{
DateTime sdate = Convert.ToDateTime(form["homefrom"]);
traces = traces.Where(t => t.tracedate >= sdate);
}
IList<trace> tracelist = traces.ToList();
return PartialView("_tracescontainer", tracelist);
答案 0 :(得分:3)
Where
会返回IEnumerable
,而非List
。由于您实际上不需要将traces
变量设置为IList
,因此应将其键入为IEnumerable
,以避免将查询结果填充到列表中的不必要开销只是为了让你可以迭代该列表并填充 new 列表。
如果在稍后的某个时间点将查询结果具体化到列表中很重要,那么在完成构建查询后,您可以在ToList
上调用IEnumerable
来构建结果为List
。
除此之外,您的实际数据源似乎是IQueryable
,表示针对数据库的查询,而不是内存集合中的查询。您应该使用IQueryable
作为变量的类型。这将构建一个查询,而不是查询的结果,以便在构建该查询后,您可以从数据库请求过滤结果,而不是将整个数据库表拉入内存并过滤它那里。