在我的MVC应用程序的服务层中,我试图将linq转换为sql实体结果到我的业务模型实体中。我目前正在尝试以下代码:
public IList<Project> GetAllProjects()
{
var results = from p in _context.Repository<DBMappings.project>()
select p;
foreach (DBMappings.project prj in results.ToList<DBMappings.project>())
yield return CreateProjectEntityFromDBProject(prj);
}
不幸的是,这似乎不起作用,我唯一可以猜到的是,yield只适用于IEnumerable。除了创建新列表,在foreach循环中添加项目并返回列表之外,还有其他解决方案吗?我需要使用IList,因为使用返回列表的方法需要能够执行列表方法,例如.Sort()。
答案 0 :(得分:7)
如果你想.Sort()
,你一定要在你的方法中创建一个列表。使用yield可以节省一些内存 - 因为结果不会存储为单个对象。当您只想查看结果时,这非常有用。但是如果你想对内存中的东西进行排序,你需要将它作为一个整体存储在内存中。
答案 1 :(得分:2)
C#规范的第8.14节(强调我的):
yield语句用于 迭代器块(第8.2节)产生一个值 到枚举器对象(§10.14.4)或 可枚举对象(第10.14.5节) 迭代器或发出信号的结束 迭代。
IList实现IEnumerable,但它没有实现IEnumerator。
答案 2 :(得分:2)
你不能“懒惰地返回”一个列表,但看起来你可以得到你想要的东西:
return results.Select(prj=>CreateProjectEntityFromDBProject(prj)).ToList();
或只是
var results = from p in _context.Repository<DBMappings.project>()
select CreateProjectEntityFromDBProject(p);
return results.ToList();
答案 3 :(得分:1)
IList<T>
描述了与IEnumerable<T>
不兼容的功能,至少就延迟加载而言。
能够转到特定索引la IList<T>
,要求整个枚举“枚举”,至少达到指定的索引。
如果您不关心整个IEnumerable<T>
的评估,那么您可以构造List<T>
将IEnumerable<T>
作为构造函数参数,然后返回{{1作为List<T>