Даже при том, что согласно измерения cobbal, № 1, кажется, является самым быстрым, я настоятельно рекомендовал бы использование String.valueOf()
. Моя причина этого состоит в том, что этот вызов явно не содержит тип аргумента, поэтому если позже Вы решаете изменить его от интервала для удвоения, нет никакой потребности изменить этот вызов. Выигрыш в быстродействии на № 1 по сравнению с № 2 только минимален, и как все мы знаем, "преждевременная оптимизация является корнем всего зла".
третье решение вне рассмотрения, так как оно неявно создает StringBuilder
и добавляет компоненты (в этом случае, число и пустая строка) к этому, и наконец преобразовывает это в строку.
Всегда 2 вещи, которые следует учитывать при оптимизации запросов:
Несколько наблюдений:
Вы выполняете манипуляции дата, прежде чем присоединиться к своим датам. Как правило, это предотвратит оптимистирующее запрос на использование индекса, даже если он существует. Вы должны попытаться написать свои выражения таким образом, чтобы индексированные столбцы существуют неизменными на одной стороне выражения.
Ваши подзапросы фильтруют до того же диапазона даты, что и Generate_Series
. Это дублирование, и он ограничивает способность оптимизации выбрать наиболее эффективную оптимизацию. Я подозреваю, что, возможно, было написано для повышения производительности, потому что Оптимер не смог использовать индекс в столбце Дата ( body_time
)?
Примечание : На самом деле мы бы очень хотели использовать Индекс на Body.body_time
порядок на
в подзаюте, находится в лучшем состоянии. В худшем случае он может заставить оптимизатор запроса сортировать набор результатов перед присоединением; И это не обязательно хорошо для плана запроса. Скорее только применяйте заказ прямо в конце для окончательного дисплея.
Использование левого присоединения
в ваших подзапрониках неуместно. Предполагая, что вы используете конвенции ANSI для NULL NULL
поведения (и вы должны быть), любой внешний включения в конверт
вернется envelope_command = null
, и эти, следовательно, будут исключены условием envelope_command =?
.
подзапросы o
и I
I почти одинаковы сохраняются для значения envelope_command
. Это заставляет Optimser отсканировать одинаковые базовые таблицы дважды. Вы можете использовать метод Pivot , чтобы присоединиться к данным один раз и разделить значения на 2 столбца.
Попробуйте следующее, которое использует технику поворота:
SELECT p.period,
/*The pivot technique in action...*/
SUM(
CASE WHEN envelope_command = 1 THEN body_size
ELSE 0
END) AS Outbound,
SUM(
CASE WHEN envelope_command = 2 THEN body_size
ELSE 0
END) AS Inbound
FROM (
SELECT date '2009-10-01' + s.day AS period
FROM generate_series(0, date '2009-10-31' - date '2009-10-01') AS s(day)
) AS p
/*The left JOIN is justified to ensure ALL generated dates are returned
Also: it joins to a subquery, else the JOIN to envelope _could_ exclude some generated dates*/
LEFT OUTER JOIN (
SELECT b.body_size,
b.body_time,
e.envelope_command
FROM body AS b
INNER JOIN envelope e
ON e.message_id = b.message_id
WHERE envelope_command IN (1, 2)
) d
/*The expressions below allow the optimser to use an index on body_time if
the statistics indicate it would be beneficial*/
ON d.body_time >= p.period
AND d.body_time < p.period + INTERVAL '1 DAY'
GROUP BY p.Period
ORDER BY p.Period
Редактирование : добавлен фильтр, предложенный TOM H.
-121--2943688- Я закончил работать вокруг этого, добавив свойство под названием Selferference, которая просто возвращает это
. Если кто-то читает это и имеет лучшее решение, я бы хотел услышать это.
Я не уверен, что именно вы хотите привязать. Единственное, что для меня имеет смысл на данный момент, - это привязать к некоторому элементу управления пользовательского интерфейса, например к элементу управления DropDown.
Обычно для отображаемого значения используются некоторые текстовые свойства и свойства значения для фактического значения, которые будут функционировать как идентификатор. В раскрывающемся списке
Вы указываете DataTextField = "Firstname"
и DataValueField = "Id"
, учитывая, что у вас есть объект со свойствами " Имя »и« Идентификатор ».
В списках вы можете использовать функцию Eval
непосредственно в своем коде ASPX или добавлять элементы управления на стороне сервера (например, литералы, Labels) внутри шаблонов списков и реализуйте событие ItemDataBound
(на примере Repeater). Вот хороший пример, который дополнительно иллюстрирует это.
Надеюсь, я смог немного помочь;)
Я думаю, что Райан здесь имеет в виду, например, если у вас есть такой объект
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
И если вы привяжете объект Person
к любому месту в GridView или Repeater к любому источнику данных, который вы связывает только Person и получает значение привязки по умолчанию из одного из своих свойств.
поддержка у нас есть переменная Ryan
из типа Person
, поэтому я хочу получить значение переменной из вызова <% # Eval ("Ryan")%>
not <% # Eval ("Ryan.FirstName")%>
Я попытался установить атрибут DefaultBindingProperty для класса, но он не работает
[System.ComponentModel.DefaultBindingProperty("FirstName")]
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
Так кто-нибудь знает, как это сделать правильно?