TextBox. TextChanged & ICommandSource

Для целей оптимизации хорошим правилом является объединение меньше, а не больше. На самом деле, вы должны попытаться объединить несколько строк, сколько сможете, с минимальным количеством строк. При любом дополнительном соединении вы будете умножать стоимость, а не увеличивать стоимость. Поскольку mysql будет просто генерировать большую умноженную матрицу.

Но ответить на ваш вопрос: на самом деле можно рассчитывать только с одним большим соединением, предполагая, что таблицы имеют уникальные ключи, а idalb - уникальное ключ для альбома. Затем, и только тогда вы можете сделать это аналогично вашему коду:

select alb.titreAlb as "Titre",
       count(distinct payalb.idAlb, payalb.PrimaryKeyFields) "Pays",
       count(distinct peralb.idAlb, peralb.PrimaryKeyFields) "Personnages",
       count(distinct juralb.idAlb, juralb.PrimaryKeyFields) "Jurons"
from album alb
left join pays_album payalb using ( idAlb )
left join pers_album peralb using ( idAlb )
left join juron_album juralb using ( idAlb )
where alb.titreAlb = "LES CIGARES DU PHARAON"
group by alb.titreAlb

, где PrimaryKeyFields обозначает поля первичного ключа объединенных таблиц (вы должны искать их).

Distinct удалит эффект, который другие соединения имеют в счетчике. Но, к сожалению, в общем случае distinct не удалит эффект, который имеют соединения, связанные с затратами.

Хотя, если у вас есть индексы, которые покрывают все поля (idAlb + PrimaryKeyFields) ваших таблиц, это может быть настолько же быстрым, как исходное решение (потому что он может оптимизировать distinct, чтобы не сортировать) и приблизится к тому, о чем вы думали (просто пройдите через каждый стол / индекс один раз). Но в нормальном или худшем случае szenario он должен выполнять хуже, чем разумное решение (например, SlimGhost), потому что вряд ли он найдет оптимальную стратегию. Но поиграйте с ним и проверьте объяснения (и опубликуйте результаты), возможно, mysql сделает что-то безумное.

10
задан Dave Clemmer 26 July 2011 в 17:31
поделиться

3 ответа

Прежде всего Вы, конечно, рассмотрели двухстороннюю привязку данных к своему viewmodel с UpdateSourceTrigger PropertyChanged? Тем путем метод set свойства свойства, с которым Вы связываете, назовут каждый раз, когда текст изменяется?

Если бы это недостаточно, то я занялся бы этой проблемой с помощью Приложенных Поведений. На Блоге Julian Dominguez Вы найдете статью о том, как сделать что-то очень похожее в Silverlight, которая должна быть легко адаптируемой к WPF.

В основном, в статическом классе (названный, скажите TextBoxBehaviours), Вы определяете Приложенное Свойство, названное (возможно), TextChangedCommand типа ICommand. Поднимите трубку обработчик OnPropertyChanged для того свойства, и в обработчике, проверьте, что свойство устанавливается на TextBox; если это, добавьте обработчик к событию TextChanged на текстовом поле, которое назовет команду указанной в свойстве.

Затем принятие Вашего viewmodel было присвоено DataContext Вашего Представления, Вы будете использовать его как:

<TextBox
  x:Name="MyTextBox"
  TextBoxBehaviours.TextChangedCommand="{Binding ViewModelTextChangedCommand}" />
18
ответ дан 3 December 2019 в 15:36
поделиться

Вы не можете только обработать событие TextChanged и выполнить команду оттуда?

private void _textBox_TextChanged(object sender, EventArgs e)
{
    MyCommand.Execute(null);
}

Альтернатива, как Вы говорите, должна создать a TextBox это действует как источник команды, но это действительно походит на излишество, если это не что-то, что Вы - планирование совместного использования и усиления во многих местах.

2
ответ дан 3 December 2019 в 15:36
поделиться

Используя привязку события и команду метод не могла бы быть правильная вещь использовать. Что точно сделает эта команда?

Вы могли бы хотеть рассмотреть использование Привязки данных к строковому полю в Вашем VM. Таким образом, можно позвонить команде или функционировать оттуда вместо того, чтобы иметь уход UI вообще.

<TextBox Text="{Binding WorldName}"/>
....
public string WorldName
{
    get
    {
        return WorldData.Name;
    }
    set
    {
        WorldData.Name = value;
        OnPropertyChanged("WorldName");
        // CallYourCustomFunctionHere();
    }
}
8
ответ дан 3 December 2019 в 15:36
поделиться
Другие вопросы по тегам:

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