Я обнаружил, что если вы публикуете публичное свойство на вашей модели в 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 не перечисляет коллекции, переданные в него, хотя.
Предполагается ли это поведение? Или я что-то пропустил?
Я не знаю SSVE или Нэнси, но я знаю, что иногда LINQ и Entity Framework не нравятся, когда вы выполняете только запрос на странице MVC (это то, что делает ваш первый метод, поскольку SelectMany()
использует отсроченное исполнение). Когда ваш запрос выполняется полностью на бэкэнд (например, когда используется .ToList()
который использует немедленное выполнение), он имеет тенденцию .ToList()
намного лучше, поскольку элементы затем уже загружаются в память.
Если это то, что происходит, по крайней мере у вас есть утешение, зная, что так происходит и в других местах.
w.GetWarnings()
) никогда не будет достигнута, поэтому SSVE никогда не вызывает его оценку. Я придерживаюсьToList()
чтобы сделать SSVE счастливым на данный момент!