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

本文关键字:替代 Linq 枚举 引擎 超级简单 视图 NancyFx | 更新日期: 2023-09-27 18:30:07

我发现,如果在类型为IEnumerable<T>的SSVE中公开Model上的公共属性,并从该属性返回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没有列举传递到它的集合。

这种行为是故意的吗?或者我错过了什么?

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

我对SSVE或Nancy不太了解,但我知道有时LINQ和实体框架不喜欢只在MVC页面上执行查询(这是您的第一个方法,因为SelectMany()采用了延迟执行)。当您的查询完全在后端执行时(如使用.ToList(),它采用立即执行),它往往更喜欢这样,因为项目已经加载到内存中。

如果这就是发生的事情,至少你可以放心地知道,在其他地方也会发生这种情况。