У меня есть таблица БД с именем События, в которой есть столбец 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 каждый раз, когда я хочу проверить достижения иперед вставкой преобразуйте в байты еще раз.
Есть ли способ получить данные непосредственно в виде битового массива?
Любой комментарий или мнение приветствуется:)
Спасибо!