2017-01-20 10 views
0

В Azure Function я пытаюсь объединить некоторые данные и записать их в таблицу.Получение атрибутов «Сущность уже существует» для записи в Azure Table Storage (с функцией Azure)

У меня есть запрос, который суммирует данные:

var query = recs 
      .GroupBy(r => new { r.Category, r.Account, r.Record }) 
      .Select(r => new ts_webhitaggregate_account 
        { 
         PartitionKey = partition, // Constant 
         RowKey = $"{r.Key.Category}:{r.Key.Account}:{r.Key.Record}", // Group By 
         rawDate = intervaldate, // Constant 
         epochDate = intervalepoch, // Constant 
         Category = r.Key.Category, // Group By 
         Account = r.Key.Account, // Group By 
         Record = r.Key.Record, // Group By 
         Hits = r.Count(), // Aggregate 
         Users = r.Select(t => t.User).Distinct().Count(), // Aggregate 
         Devices = r.Select(t => t.Device).Distinct().Count() // Aggregate 
        }); 

Я затем попытаться передать эти записи в ICollector связанной таблице

foreach (ts_webhitaggregate_account a in query.ToList()) 
{ 
    webhitsAggAccount.Add(a); 
} 

Я часто встречая «Объект уже существует» ошибка например:

Исключение было выбрано целью вызова. Microsoft.WindowsAzure.Storage: 82: указанный объект уже существует.

Если бы я писал сопоставимую инструкцию SQL для C#, я бы не ожидал, что дубликаты составного ключа будут возможны, поскольку каждое записываемое значение - это ключ, константа или агрегация. У меня также нет ранее существовавших данных в таблице, которые могут вызвать конфликт.

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

ответ

1

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

Если вы сомневаетесь, распечатайте все на консоли!

0

Сообщение об ошибке сообщило нам, что сущность, которая уже существует. Как я знаю, коллекция кажется, имеет сущность с тем же PartitionKey и RowKey. Попробуйте использовать insert or update method, чтобы узнать, может ли он помочь вам.

+0

Извините Jambor, но это будет означать, что писать намного больше кода, поскольку Azure Functions не могут использовать этот метод из коробки afaik. Я ожидаю, что возникнет проблема с моим кодом, генерирующим элементы, которые нужно вставить, - похоже, что он должен генерировать только уникальные строки, которые нужно вставить мне –

+0

Кроме того, fwiw ... я написал пакетный метод InsertOrReplace и имел те же ошибки поэтому я решил, что проблема заключается в том, как я генерирую вещи, которые нужно вставить –

0

Просто побочный комментарий и может быть полезен для отладки. В появившемся сообщении об ошибке «82: указанный объект уже существует». число 82 является индексом проблемного (дублированного) элемента в пакетной операции.