Делегат по сравнению с ключевым словом делегата

KeyConditionExpression можно применять только к разделу и при необходимости для сортировки ключа. Документация гласит следующее.

Используйте параметр KeyConditionExpression, чтобы указать конкретное значение ключа раздела. Операция Query вернет все элементы из таблицы или индекса с этим значением ключа раздела. При желании вы можете сузить область действия операции Query, указав значение ключа сортировки и оператор сравнения в KeyConditionExpression.

blockquote>

Та же самая документация продолжается с

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

blockquote>

Таким образом, вы можете использовать FilterExpression для более узкого набора результатов, что может обеспечить поддержку для вашего второго варианта использования.

Если этого недостаточно, вам, вероятно, нужно изучить , используя индексы , Global Secondary Index (GSI) специально. В основном индекс создаст другую таблицу с другими ключами. Чтобы поддержать ваше второе требование, я думаю, что следующая структура GSI могла бы работать.

name | code
-----------
PRD  | 425
PRD  | 456
PRD  | 427
....

Где name - ключ раздела, а код - ключ сортировки. Но эти пары атрибутов должны всегда составлять уникальный первичный ключ для каждой записи, иначе вы не сможете использовать эту структуру.

Приложение : просмотрев мой пост и перечитав ваш вопрос, я понял, что у вас нет отдельных атрибутов имени и кода, но есть один атрибут с данными, такими как «PRD 425» и «PRD». 426" . У меня нет опыта в этом. В документации Query снова говорится следующее о KeyConditionExpression

Условие, которое указывает значение (я) ключа для элементов, которые должны быть получены действием Query.

Условие должно выполнить проверку на равенство значения ключа одного раздела.

Условие может дополнительно выполнять один из нескольких сравнительных тестов для одного значения ключа сортировки. Это позволяет Query получать один элемент с заданным значением ключа раздела и значением ключа сортировки или несколько элементов, которые имеют одинаковое значение ключа раздела, но разные значения ключа сортировки.

blockquote>

Насколько я понимаю, вы не можете ограничить его требуемым способом.

Приложение 2 : После долгих раздумий я вспомнил, что документация DynamoDB обычно предлагает стратегию, в которой, например, к ключу разделения добавляется случайное число. К сожалению, у меня нет подробной информации о том, как выполнять запросы к этой схеме, но она должна дать вам советы по организации ваших данных.

37
задан MikeH 1 November 2018 в 16:12
поделиться

6 ответов

От http://msdn.microsoft.com/en-us/library/system.delegate.aspx :

Делегат класс является базовым классом для типов делегатов. Однако только Система и компиляторы могут получить явно из класса Delegate или из класса MulticastDelegate . Это также не допускается вывод новый тип из типа делегата. Делегат класса не считается тип делегата; это класс, используемый для наследовать типы делегатов.

Большинство языков реализуют делегат ключевое слово и компиляторы для тех языки могут быть выведены из MulticastDelegate class; следовательно, пользователи должны использовать ключевое слово делегат предоставленный языком.

35
ответ дан 27 November 2019 в 04:28
поделиться

Ключевое слово делегата предназначено для того, чтобы компилятор сделал для вас какое-то волшебство. Когда вы объявляете новый делегат с настраиваемой подписью,

  • компилятор создает новый тип для вас, производный от MulticastDelegate (который, в свою очередь, наследуется от Delegate).
  • компилятор добавляет метод Invoke с вашей настраиваемой подписью
  • аналогично, компилятор добавляет методы BeginInvoke и EndInvoke для этого нового типа

Так что теперь, когда вы вызываете delObject (args) - компилятор переводит это в delObject.Invoke (args)

Делегат Базовый класс предоставляет некоторые функциональные возможности, такие как

  1. CreateDelegate (для получения делегата, обертывающего метод static / instance)
  2. DynamicInvoke (для вызова делегата со списком аргументов - поздняя граница)
  3. Объединить и удалить (для делегата сцепление .. объединение нескольких делегатов, например несколько делегатов обработчика событий для события)

Компилятор C # запрещает вам наследовать делегат явно в вашем коде ... вы должны использовать ключевое слово делегат.

38
ответ дан 27 November 2019 в 04:28
поделиться

Еще одна полезная вещь, которую вы можете сделать с ключевым словом делегат , - это создание встроенных делегатов без их объявления, например:

// constructor
public Form1()
{
    this.Load += delegate(object sender, EventArgs e)
    {
         // Form1_Load code goes right here
    }
}
3
ответ дан 27 November 2019 в 04:28
поделиться

Преимущество класса Delegate состоит в том, что он является базовым классом для всех типов делегатов в .Net. Наличие метода, который принимает экземпляр этого класса, позволяет вам работать в общем случае для всех типов делегатов. По этой причине такие операции, как ISynchronizedInvoke.Invoke, используют это как параметр.

2
ответ дан 27 November 2019 в 04:28
поделиться

One of the things the Delegate class can be used for is more control when invoking event handlers. For example, with normal event processing, an exception in any event handler will prevent any later event handlers from being called. You can alter that behavior by using the Delegate class to manually invoke each event handler.

using System;

namespace DelegateClass
{
    class EventSource
    {
        public event EventHandler TheEvent;

        internal void RaiseEvent1()
        {
            EventHandler handler = TheEvent;
            if (handler != null)
                handler(this, EventArgs.Empty);
        }

        internal void RaiseEvent2()
        {
            EventHandler handler = TheEvent;
            if (handler == null)
                return;

            Delegate[] handlers = handler.GetInvocationList();
            foreach (Delegate d in handlers)
            {
                object[] args = new object[] { this, EventArgs.Empty };
                try
                {
                    d.DynamicInvoke(args);
                }
                catch (Exception ex)
                {
                    while (ex.InnerException != null)
                        ex = ex.InnerException;

                    Console.WriteLine(ex.Message);
                }
            }
        }
    }

    class Program
    {
        static void Handler1(object sender, EventArgs e)
        {
            Console.WriteLine("Handler1");
        }

        static void Handler2(object sender, EventArgs e)
        {
            Console.WriteLine("Handler2");
            throw new InvalidOperationException();
        }

        static void Handler3(object sender, EventArgs e)
        {
            Console.WriteLine("Handler3");
        }

        static void Main(string[] args)
        {
            EventSource source = new EventSource();
            source.TheEvent += Handler1;
            source.TheEvent += Handler2;
            source.TheEvent += Handler3;

            try
            {
                source.RaiseEvent1();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

            Console.WriteLine("-------------------");

            source.RaiseEvent2();
        }
    }
}
2
ответ дан 27 November 2019 в 04:28
поделиться

С точки зрения реализации класс Delegate определяет поля, используемые для представления указателя функции делегата, а класс MultiCastDelegate предоставляет функциональные возможности базовой линии, используемые событиями. Также, как упоминали другие люди, Delegate предоставляет метод «DynamicInvoke», который позволяет вам вызывать любой делегат.

1
ответ дан 27 November 2019 в 04:28
поделиться
Другие вопросы по тегам:

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