繁体   English   中英

NancyFx超级简单视图引擎-替代Linq Enumerables

[英]NancyFx Super Simple View Engine - Substituting Linq Enumerables

我发现,如果您在类型为IEnumerable<T> SSVE中对模型公开一个公共属性,并从该属性返回Linq枚举,则SSVE似乎认为该集合中没有任何值(检查@If.HasValues ,因此@Model.Values是可枚举的)。

例如,我的C#属性是:

public IEnumerable<string> Warnings
{
    get
    {
        return WarningGenerators.SelectMany(w => w.GetWarnings());
    }
}

在这种情况下,以下html根本不会在生成的页面中显示(DOM中不存在):

@If.HasWarnings
<div class="row">
    <div class="col-lg-12">
        @Partial['WarningsWidget.sshtml', Model.Warnings]
    </div>
</div>
@EndIf

但是,如果我将C#更改为此(不进行其他更改),则会显示html:

public IEnumerable<string> Warnings
{
    get
    {
        return WarningGenerators.SelectMany(w => w.GetWarnings()).ToList();
    }
}

显然,对ToList()的调用正在枚举枚举,然后SSVE会提取这些条目。 我很惊讶SSVE并未枚举传递给它的集合。

这是故意行为吗? 还是我错过了什么?

我不太了解SSVE或Nancy,但我确实知道有时LINQ和Entity Framework不喜欢只在MVC页面上执行查询(这是SelectMany()采用的第一种方法SelectMany() 推迟执行 )。 当您的查询完全在后端执行时(例如,使用.ToList()时采用立即执行 ),它往往会好很多,因为这些项已经被加载到内存中了。

如果这是怎么回事,至少您可以放心地知道它在其他地方也是如此。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM