我有一个项目,其中实现了自己的配置类:
IconSizesConfigSection: ConfigurationSection
IconSizesCollection: ConfigurationElementCollection
IconSize: ConfigurationElement
在Config
类中存在此属性:
public IQueryable<IconSize> IconSizes
{
get
{
IconSizesConfigSection configInfo = (IconSizesConfigSection)ConfigurationManager.GetSection("iconConfig");
return configInfo.IconSizes.OfType<IconSize>().AsQueryable<IconSize>();
}
}
IconSizes
属性返回IconSizesCollection
,其派生自ConfigurationElementCollection
。反过来ConfigurationElementCollection
来自ICollection
,IEnumerable
。
在另一个班级,我有这样的代码:
var previewIconSize = Config.IconSizes.FirstOrDefault(c => c.Name == "AvatarSize");
为什么在这种情况下使用Deffered Execution?
为什么最初它使用AsQueryable<IconSize>()
进行收集然后使用LINQ和Deffered Execution?
与使用简单的List相比有什么好处吗?
答案 0 :(得分:1)
在这种情况下,没有实际的好处。使用IQueryable
有助于查询重写/翻译将优化性能的情况。在提供的示例中,您实际上会降低性能。
以有用的方式使用IQueryable
的一个示例是,在对数据库或Web服务进行延迟转换和评估查询时获得的显着性能提升。这将比使用“简单列表”提取大量结果集和在活动内存中应用查询逻辑的替代方法表现得更好。
在您的情况下,使用IQueryable
的方式是有害的,因为当您开始查询时,集合已经加载到内存中。
答案 1 :(得分:1)
IEnumerable和IQueryable都使用延迟执行。不同之处在于IQueryable用于跨越边界,如数据库查询,实体框架查询或OData查询。
当IQueryable被迭代时,查询被转换为远程提供者的习语并在那里执行。当从远程提供程序收到响应时,它将转换为本地对象表示。
答案 2 :(得分:0)
延迟执行很好,因为您的用户可能永远不会使用结果集,因此没有必要查询数据源。
您的用户可能会使用某些LINQ方法,除非他们将结果转换为IQueryable,这意味着您可能会限制他们可以执行的操作,或强制他们将列表转换/复制到更有用的内容。
如果您使用List,那么您很难将解决方案编写为List,您是否关心该集合的实现是什么,您的用户是否......只要它支持必要的接口就可能不会。 / p>