Вы забыли сообщить нам, является ли ваша последовательность model.Content.Children<NewsItem>()
IEnumerable
или IQueryable
.
Если вы не знаете, что это значит: это процесс, который будет выполнять перечисление, или другой процесс, например, система управления базами данных, собирающая данные для вас?
Если последовательность IEnumerable
, я бы посоветовал создать класс Compare, который сделает сравнение за вас. Преимущество состоит в том, что если в будущем вы решите заказать по-другому, ваш LINQ не изменится. Недостаток: это не будет работать с базами данных (вот почему я спросил, было ли это IQueryable). Случай IEnumerable находится в конце.
IQueryable чаще всего используется, когда запрос должен быть выполнен другим процессом, таким как система управления базами данных. Поскольку это должно быть выполнено кем-то другим, функциональность ограничена довольно простыми функциями. В конце концов: вы могли бы создать VeryUsefulFunction()
, но SQL этого не знает.
Если опубликованная дата не установлена, я хочу вместо этого упорядочить по дате создания
blockquote>Поэтому нам нужно выбрать, где вы извлекаете OrderDate: или ОпубликованоDate или CreatedDate. После этого вы можете сделать заказ по OrderDate
var result = model.Content.Children<NewsItem>().Select(newsItem => new { OrderDate = newsItem.PublishedDate ?? newsItem.CreatedDate, Item = newsItem, }) .OrderBy(newsItem => newsItem.OrderDate) // if desired, throw away the OrderDate: .Select(newsItem => newsItem.Item)
Несколько LINQ-to-entity не примут оператор объединения нулей (??). В этом случае вы получите исключение во время выполнения. В этом случае вам нужно использовать троичный оператор (?:)
IEnumerable
Вы можете использовать код IQueryable также как Enumerable. Однако в этом случае вы бы смешали концепцию «более раннего newsItem» с вашей обработкой, сделав их менее читабельными, менее тестируемыми и менее изменяемыми. Например, если вам нужна концепция упорядочивания новостей снова и снова, вам придется скопировать и вставить этот код. Кроме того, если в будущем вы захотите упорядочить по-другому, например, упорядочить по длине новостного элемента, вам нужно будет найти и переписать все ваши операторы LINQ, которые упорядочивают новостные элементы.
Лучше было бы определить, какая новость предшествует другой новости. Для этого вы пишете класс, который реализует
IComparer<NewsItem>
.class NewsItemComparer : IComparer<NewsItem> { public static readonly IComparer<NewsItem> Default = new NewsItemComparer(); private static readonly IComparer<DateTime> dateComparer = Comparer<DateTime>.Default; public int Compare(NewsItem x, NewItem y) { // TODO: decide what to do if x or y NULL: exception? first? last? return dateComparer.Compare(x.PublishedDate ?? x.CreatedDate, y.PublishedDate ?? y.CreatedDate); } }
Использование:
var result = model.Content.Children<NewsItem>() .OrderBy(newsItem => newsItem, NewsItemComparer.Default);
Это выглядит намного лучше, чем помещение кода сравнения в ваш запрос. Если вы решите сравнивать по-другому, этот код и все другие, которые хотят сравнить ваши NewsItems, не изменятся. Даже довольно просто реализовать различные методы сравнения, например, по дате, по длине или по автору ...
Лично, я не нашел использование SSL для всего сайта (или большая часть из него), чтобы быть излишеством. Возможно, только что, когда скорости и подача были медленнее. Теперь я не смущался бы подвергать любую часть сайта под SSL.
, Если Вы решили, что использование SSL для всего сайта приемлемо, Вы могли бы рассмотреть просто использование старой "Стандартной аутентификации", куда сервер возвращается 401 ответ, который заставляет браузер запрашивать имя пользователя/пароль. Если Ваше приложение может жить с этим типом входа в систему, работает отлично для Ajax и всех других доступов к Вашему сайту, потому что браузер обрабатывает повторно отправляющие запросы с соответствующими учетными данными (и безопасно, если Вы используете SSL, но только , если Вы используете SSL - не используют Основного автора с плоскостью http!).
SSL - необходимость, предотвращая прозрачные соединения прокси, которые могли использоваться несколькими пользователями. Тогда я просто проверил бы входящий IP-адрес с тем, который аутентифицировался.
Повторно аутентифицируйте:
Общее решение состоит в том, чтобы хешировать идентификатор сессии пользователя и передачу, которая в с каждым запросом для обеспечения запроса прибывает от действительного пользователя (см. этот слайд-шоу ). Это довольно безопасно от перспектива CSRF , но если бы кто-то осуществлял сниффинг данных, то это могло бы быть прервано. В зависимости от Ваших потребностей ssl всегда будет самым безопасным методом.
Ваш лучший выбор использует соединение SSL по ранее аутентифицируемому соединению с чем-то Apache и/или Tomcat. основанная на форме аутентификация в любой, с необходимым соединением SSL дает Вам безопасное соединение. Веб-приложение может тогда обеспечить безопасность и идентификационные данные для сессии, и клиентский Ajax не должен касаться безопасности.
Что, если Вы помещаете "сгенерированную" метку времени на каждый из ответов с сервера и приложения Ajax, могло всегда использовать cookie с последней меткой времени.
Вы могли бы попытаться читать книжную безопасность Ajax Billy Hoffman и Bryan Sullivan. Я нашел, что это изменило мой образ мыслей о безопасности. Существуют очень определенные предложения для каждой фазы Ajax.