Укажите пустой DataTemplate по умолчанию вместо 'ToString по умолчанию ()' DataTemplate

  1. Индексирование'valuationId 'рекомендуется делать здесь. Ожидая, что реализация BTree должна быть в состоянии обеспечить счет в порядке миллисекунд. (< 10 мс)

Да, без индекса движок должен выполнить полное сканирование таблицы. Однако при использовании индекса ему не нужно будет получать доступ к записям данных, но он может получить счет только из индекса. Для этого ему нужно прочитать количество записей индекса, которое намного меньше числа записей данных, поскольку:

  • Листовые блоки индекса имеют несколько указателей записей, которые читаются в чанках блока. [ 112]
  • Количество дополнительных операций чтения блоков, необходимых для выделения листовых блоков, которые относятся к идентификатору оценки, является логарифмическим по отношению к общему количеству блоков.

Например, если размер блока равен 10, а 50 000 записей имеют идентификатор оценки, то необходимо прочитать около 5555 блоков. Сравните это как минимум с 500 000 блоков, которые нужно прочитать при сканировании таблицы. Очевидно, что у баз данных есть методы оптимизации, которые усложняют справедливое сравнение, и поэтому имеет смысл просто попробовать это.

  1. Какие могут быть возможные недостатки, если таковые имеются, для индексации такого атрибута с низкой мощностью?

Роль мощности зависит от того, сколько записей данных уместится в одном блоке (т. е. < = recordsize / blocksize). Если это число приблизится к количеству элементов, то преимущество индекса исчезнет.

  1. Каковы другие наилучшие подходы для получения счетчика (*).

Вы можете переоценить, насколько важно иметь точный счет, когда такой счет составляет порядка 50 000, и зная, что через секунду после того, как вы получите счет, возможно, уже были новые вставки / удаления. Имеет ли значение, действительно ли это 49 756, а не 49 695?

Если с приближением все в порядке, запустите запланированное пакетное задание, которое выполняет подсчет всех идентификаторов оценки и сохраняет его в отдельной таблице «подсчет» (в которой будет около 100 записей). В зависимости от ваших потребностей, вы можете запланировать его запуск один раз в день, в час, ... в зависимости от оборота и необходимой точности. Тогда у вас скорость молнии за счет незначительной неточности.

Чтобы повысить точность, вы можете объединить приведенную выше таблицу «count» с триггером вставки / удаления в таблицу данных, который бы вставил эффект этого изменения (в виде значения +1 или -1) в таблицу журнала. Тогда запрос количества записей будет использовать таблицу «count» в качестве отправной точки и изменить результат на основе этих значений + 1 / -1 в таблице журнала. Вышеуказанное задание будет очищать журнал при каждом запуске.

10
задан svick 4 January 2014 в 12:35
поделиться

2 ответа

Я не знаю ни о каком способе сделать это. Согласно комментарию Joe ниже, WPF конкретно запрещает определение a DataTemplate для типа Object.

В зависимости от Ваших строгих требований может быть легче искать a DataTemplate это соответствует определенному типу. Если Вы находите один, используйте его. Иначе ничего не отобразите. Например:

<ContentControl Content="{Binding YourContent}" ContentTemplateSelector="{StaticResource MyContentTemplateSelector}"/>

И в Вашем селекторе (псевдокод, очевидно):

var dataTemplateKey = new DataTemplateKey() { DataType = theType; };
var dataTemplate = yourControl.FindResource(dataTemplateKey);

if (dataTemplate != null)
{
    return dataTemplate;
}

return NulloDataTemplate;
4
ответ дан 4 December 2019 в 00:27
поделиться

Я не уверен в замене DataTemplate по умолчанию, но можно использовать ValueConverter для передачи, отображают ToString в случае определенных типов и пустой строки иначе. Вот некоторый код (обратите внимание, что typeb textblock не имеет преобразователя на нем для показа то, на что он обычно похож):

.xaml:

<Window x:Class="EmptyTemplate.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:loc="clr-namespace:EmptyTemplate"
    Title="Window1" Height="300" Width="300">
    <Window.Resources>
        <loc:AType x:Key="atype"/>
        <loc:BType x:Key="btype"/>
        <loc:TypeConverter x:Key="TypeConverter"/>
    </Window.Resources>
    <StackPanel>
        <Button Content="{Binding Source={StaticResource atype}, Converter={StaticResource TypeConverter}}"/>
        <Button Content="{Binding Source={StaticResource btype}, Converter={StaticResource TypeConverter}}"/>
        <TextBlock Text="{Binding Source={StaticResource atype}, Converter={StaticResource TypeConverter}}"/>
        <TextBlock Text="{Binding Source={StaticResource btype}}"/>
    </StackPanel>
</Window>

.xaml.cs:

namespace EmptyTemplate
{
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }
    }

    public class AType { }

    public class BType { }

    public class TypeConverter : IValueConverter
    {
        public DataTemplate DefaultTemplate { get; set; }

        #region IValueConverter Members

        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value.GetType() == typeof(AType))
            {
                return value.ToString();
            }
            return DefaultTemplate;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }

        #endregion
    }
}
1
ответ дан 4 December 2019 в 00:27
поделиться
Другие вопросы по тегам:

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