Получение значения типа BIT (X) DB с помощью Dapper Repostory - PullRequest
0 голосов
/ 17 мая 2018

У меня есть таблица БД с именем События, в которой есть столбец BIT (4) с именем «достижения», используемый для хранения 4 флагов, связанных с некоторыми достижениями.Поэтому, если у нас есть значение «0011» (3), это означает, что достижения 1 и 2 выполнены.

Для вставки и получения данных я использую репозитории Dapper в ASP .NET CORE.Я делал несколько тестов, чтобы найти лучший способ вставить и извлечь данные о достижениях, но я не смог найти хороший.Вот мои результаты:

1.Использование BitArray

Класс сущности:

public class EventEntity
{
  public ulong AId { get; set; }
  ...
  public BitArray AchievementList {get; set; }
}

Тест вставки данных:

var event = new EventEntity();
event.AchievementList.Set(0, true);
event.AchievementList.Set(1, true); 

await EventRepo.InsertAsync(event);

Этот способ не работает, потому что когда SqlGenerator пытается создать SQL вставки,он получает только те свойства (столбцы), которые соответствуют следующим критериям:

public static Func<PropertyInfo, bool> GetPrimitivePropertiesPredicate()
    {
        return p => p.CanWrite && (p.PropertyType.IsValueType() || p.PropertyType == typeof(string) || p.PropertyType == typeof(byte[]));
    }

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

Я предпочитаю не связываться с Dapper Repository, поэтому для меня это не вариант.

2.Использование байта

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

Класс сущности:

public class EventEntity
{
  public ulong EventId { get; set; }
  ...
  public byte AchievementList {get; set; }
}

Вставка данных и выбор теста:

var event = new EventEntity();
event.AchievementsList = 3; // 0011, achievements 1 and 2 are done

await EventRepo.InsertAsync(event);

var res = EventRepo.FindAsync(x => x.EventId  == event.EventId);

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

Есть ли способ получить данные непосредственно в виде битового массива?

Любой комментарий или мнение приветствуется:)

Спасибо!

...