【问题标题】:NancyFx Super Simple View Engine - Substituting Linq EnumerablesNancyFx 超级简单的视图引擎 - 替代 Linq 枚举
【发布时间】:2014-11-13 04:51:47
【问题描述】:

我发现,如果您在 IEnumerable<T> 类型的 SSVE 中公开模型上的公共属性并从该属性返回 Linq 枚举,SSVE 似乎认为该集合中没有任何值(检查 @ 987654322@,所以@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 没有枚举传递给它的集合。

这种行为是有意的吗?还是我错过了什么?

【问题讨论】:

    标签: c# linq nancy


    【解决方案1】:

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

    如果发生了这样的事情,至少你可以放心地知道它在其他地方也会发生这样的事情。

    【讨论】:

    • 很高兴看到在其他地方遇到了相同的行为。正如你所说,在代码中更远的枚举(在w.GetWarnings())中放置一个断点永远不会被命中 - 所以SSVE永远不会导致它被评估。我一直坚持使用 ToList() 来让 SSVE 现在开心!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-08
    相关资源
    最近更新 更多