Свяжите для возражения себе, не одному из, его - свойства

Даже при том, что согласно измерения cobbal, № 1, кажется, является самым быстрым, я настоятельно рекомендовал бы использование String.valueOf(). Моя причина этого состоит в том, что этот вызов явно не содержит тип аргумента, поэтому если позже Вы решаете изменить его от интервала для удвоения, нет никакой потребности изменить этот вызов. Выигрыш в быстродействии на № 1 по сравнению с № 2 только минимален, и как все мы знаем, "преждевременная оптимизация является корнем всего зла".

третье решение вне рассмотрения, так как оно неявно создает StringBuilder и добавляет компоненты (в этом случае, число и пустая строка) к этому, и наконец преобразовывает это в строку.

6
задан Ryan 15 September 2009 в 16:18
поделиться

3 ответа

Всегда 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, которая просто возвращает это . Если кто-то читает это и имеет лучшее решение, я бы хотел услышать это.

2
ответ дан 11 December 2019 в 00:40
поделиться

Я не уверен, что именно вы хотите привязать. Единственное, что для меня имеет смысл на данный момент, - это привязать к некоторому элементу управления пользовательского интерфейса, например к элементу управления DropDown.

Обычно для отображаемого значения используются некоторые текстовые свойства и свойства значения для фактического значения, которые будут функционировать как идентификатор. В раскрывающемся списке

  • DataTextField
  • DataValueField

Вы указываете DataTextField = "Firstname" и DataValueField = "Id" , учитывая, что у вас есть объект со свойствами " Имя »и« Идентификатор ».

В списках вы можете использовать функцию Eval непосредственно в своем коде ASPX или добавлять элементы управления на стороне сервера (например, литералы, Labels) внутри шаблонов списков и реализуйте событие ItemDataBound (на примере Repeater). Вот хороший пример, который дополнительно иллюстрирует это.

Надеюсь, я смог немного помочь;)

1
ответ дан 11 December 2019 в 00:40
поделиться

Я думаю, что Райан здесь имеет в виду, например, если у вас есть такой объект

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; }
}

Так кто-нибудь знает, как это сделать правильно?

2
ответ дан 11 December 2019 в 00:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: