Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
News = context.News.Where(x => !x.IsDeleted).ToArray().Select(x => new NewsModel(x))
.Where(c).Any(), когда можно сказать просто Any(c)?foreach() {if}, когда можно сказать Where()?Вообще, конечно, статья ни о чем. Нигде не объясняется, зачем (например, зачем новости имеют древовидную структуру) или почему (например, почему для отображения нужна отдельная модель) что-то делается.
Ну и код, конечно, ужасающий.
.Where©.Any(), когда можно сказать просто Any©?
foreach() {if}, когда можно сказать Where()?
Логика в view (в том числе — логика отбора данных)?
Partial вместо helper?
Тут суть не в новостях, а в работе с древовидным списком.
Для отображения нужна отдельная модель, чтобы напрямую не работать с базой данных,
потому что это может повлечь за собой различные проблемы. Например, нарушение целостности и потерю информации.
Я, заметим, не спорю, что отдельная viewmodel — это правильно. Только, в отличие от вашего поста, я могу четко показать зачем она нужна (и более того, как ее введение убирает разом все мои вопросы к вашему коду представления).
Неподгруженные ссылки и коллекции будут выкидывать System.ObjectDisposedException(«Экземпляр ObjectContext был удален и больше не может использоваться в операциях, требующих соединения.») при обращении к ним.
Нужно отдать за пределы — скопируй в data object.
Если работать напрямую с контекстом будет постоянное соединение с базой данных.
Модель будет зависеть от конкретной реализации БД.
Модель уже сформирована и храниться в оперативной памяти, что ускоряет работу с данными.
Изменяя модель вы будете, автоматически изменять базу данных, что не есть хорошо. (Утрированно конечно, для сохранения изменений нужно вызвать SaveChanges(), но мало ли, что)
Если что-то упустил и вы знаете больше, поправьте или добавьте.
2. Модель будет зависеть от конкретной реализации БД.
.Where(c).Any(), когда можно сказать простоAny(c)?
.Where() имеет оптимизации для итерирования разных типов коллекций, а .Any() — нет. public static bool Any<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
{
if (source == null)
throw Error.ArgumentNull("source");
if (predicate == null)
throw Error.ArgumentNull("predicate");
foreach (TSource source1 in source)
{
if (predicate(source1))
return true;
}
return false;
}
public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
{
if (source == null)
throw Error.ArgumentNull("source");
if (predicate == null)
throw Error.ArgumentNull("predicate");
if (source is Enumerable.Iterator<TSource>)
return ((Enumerable.Iterator<TSource>) source).Where(predicate);
if (source is TSource[])
return (IEnumerable<TSource>) new Enumerable.WhereArrayIterator<TSource>((TSource[]) source, predicate);
if (source is List<TSource>)
return (IEnumerable<TSource>) new Enumerable.WhereListIterator<TSource>((List<TSource>) source, predicate);
else
return (IEnumerable<TSource>) new Enumerable.WhereEnumerableIterator<TSource>(source, predicate);
}
.Where(fn).Any() на .Any(fn)Выходит, Resharper даёт вредный совет заменить .Where(fn).Any() на .Any(fn)
Древовидный список на ASP.NET MVC 4