Для небольших проектов вы правы. Я слышу ваш аргумент и сочувствую - однако есть веские причины для этой, тяжелой и повторяющейся работы, особенно в более крупных и более сложных приложениях:
Repository.Get
может возвращать lazily-оцененный объект IQueryable
, что означало бы, что БД не пострадает, пока не будет оценен вид. По целому ряду причин это плохо. (Обходной путь состоит в том, чтобы вызвать .ToList
, пока он все еще находится в контроллере). User { UserId, UserName, PasswordHash, PasswordSalt, EmailAddress, CreatedDate }
, тогда как поля на странице «Сведения о пользователе» будут User { UserId, UserName, Password, ConfirmYourPassword, EmailAddress }
, do вы видите разницу? Ergo, вы не можете использовать модель пользователя EF в качестве модели представления, вы должны использовать отдельный класс. UserId
. ASP.NET будет переписывать это значение во время привязки и, если вы специально не дезинформируете его (что будет так же тяжело, как создание отдельных ViewModels), тогда эта уязвимость останется. небольшое обходное решение в вашем случае Я поделюсь с вами, но учтите предварительные условия:
... тогда вы можете сделать это:
ViewData
, или ViewBag
в MVC 4 (или даже общий ViewData<T>
, если вы хардкор). Это полезно для хранения заголовков HTML-страниц и обмена данными с мастер-страницами. View<TModel>
. Но используйте этот подход с осторожностью, потому что он может ввести несогласованность.
MySQL имеет удобную функцию под названием FIELD()
, которая отлично подходит для таких задач.
ORDER BY FIELD(Language,'ENU','JPN','DAN'), ID
Обратите внимание, что
Если это единственные три значения, вы можете использовать a CASE
выражение :
ORDER BY `ID`,
CASE `Language`
WHEN 'ENU' THEN 1
WHEN 'JPN' THEN 2
WHEN 'DAN' THEN 3
END
(Если могут быть другие значения, тогда вы можете захотеть чтобы добавить некоторую дополнительную логику, чтобы упорядочить упорядочение, например, вы можете добавить ELSE 4
к этому выражению CASE
, а затем упорядочить по Language
в качестве третьего критерия заказа:
ORDER BY `ID`,
CASE `Language`
WHEN 'ENU' THEN 1
WHEN 'JPN' THEN 2
WHEN 'DAN' THEN 3
ELSE 4
END,
`Language`
)
У вас есть пара опций, прежде всего, чтобы изменить язык на ENUM (если это возможно, и вы ожидаете только нескольких вариантов)
Если вы укажете его как ENUM('ENU','JPN','DAN')
, тогда ORDER Language ASC
будет заказывать в указанном порядке.
Второй будет включать в себя случай где-то, т. е.
SELECT * FROM table
ORDER BY CASE Language
WHEN 'ENU' THEN 3
WHEN 'JPN' THEN 2
WHEN 'DAN' THEN 1
ELSE 0
END DESC, ID ASC
По производительности метод ENUM вернет более быстрые результаты, но будет больше хлопот, если вам нужно добавить больше языков. Третьим вариантом будет добавление таблицы нормализации для языков, однако в этом случае это может быть излишним.
CASE
нуждаются END CASE
, это зависит от контекста. CASE
в рамках ПРОЦЕДУРЫ требуют END CASE
( dev.mysql.com/doc/refman/5.5/en/case.html ), однако CASE
в SELECT не требует END CASE
, просто END
( dev.mysql.com/doc/refman/5.7/en/… ) - в этом контексте это функция потока управления.
– Simon at mso.net
10 November 2017 в 19:33
GROUP BY
раньше? Например, первое значение, которое я хочу, появляется в конце? – Pathros 25 March 2015 в 19:51GROUP BY
в подзапрос и закажите его во внешнем запросе – Mchl 25 March 2015 в 21:55