NancyFx Super Simple View Engine - замена перечислимых Linq

1

Я обнаружил, что если вы публикуете публичное свойство на вашей модели в SSVE типа IEnumerable<T> и возвращаете перечисление Linq из этого свойства, SSVE, похоже, не считает, что в этой коллекции есть значения (проверка @If.HasValues, поэтому @Model.Values является перечислимым).

Например, мое свойство С#:

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

Но если я изменю свой С# на это (без каких-либо изменений), появится html:

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

Очевидно, что вызов ToList() перечисляет перечисляемый, и записи затем подбираются SSVE. Я удивлен, что SSVE не перечисляет коллекции, переданные в него, хотя.

Предполагается ли это поведение? Или я что-то пропустил?

Теги:
linq
nancy

1 ответ

0
Лучший ответ

Я не знаю SSVE или Нэнси, но я знаю, что иногда LINQ и Entity Framework не нравятся, когда вы выполняете только запрос на странице MVC (это то, что делает ваш первый метод, поскольку SelectMany() использует отсроченное исполнение). Когда ваш запрос выполняется полностью на бэкэнд (например, когда используется .ToList() который использует немедленное выполнение), он имеет тенденцию .ToList() намного лучше, поскольку элементы затем уже загружаются в память.

Если это то, что происходит, по крайней мере у вас есть утешение, зная, что так происходит и в других местах.

  • 0
    Приятно видеть, что такое же поведение встречается в других местах. Точно так же, как вы сказали, установка точки останова в коде дальше по перечислению (внутри w.GetWarnings() ) никогда не будет достигнута, поэтому SSVE никогда не вызывает его оценку. Я придерживаюсь ToList() чтобы сделать SSVE счастливым на данный момент!
  • 0
    Не забудьте пометить это как ответ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню