Поскольку вы работаете с кодом, я бы посоветовал поместить ваши теги в отдельную таблицу и иметь отношение «многие ко многим» между уведомлениями и тегами. Это сэкономит вам много работы сейчас и в будущем, если у вас большая заполненная база данных и вам нужно внести изменения: связь "многие ко многим" между уведомлениями и тегами. Не требуется ни API-интерфейса, ни атрибутов.
Требование : Учитывая текст нескольких тегов, дайте мне все уведомления со всеми этими тегами:
IEnumerable<string> tagTexts = ...
var notifications = dbContext.Tags.Where(tag => tagTexts.Contains(tag.Text)
.SelectMany(tag => tag.Notifications)
.Distinct();
Требование Удалить все уведомления, в которых есть только теги с текстом «SQL»
string tagText = "SQL";
var notificationsWithOnlyTagSQL = dbContext.Notifications
.Where(notification => notification.Tags.All(tag => tag.TagText == tagText)
.ToList();
dbContext.Notifications.RemoveRange(notificationsWithTagSQL);
Требование Убедитесь, что все теги с «sql», «SQL "," Sql ", et c используйте тот же текст:" SQL "(предположим, у вас есть база данных без учета регистра)
const string proposedTagText = "SQL";
var tagsToChange = dbContext.Tags.Where(tag => tag.TagText == proposedTagText).ToList();
foreach (var tag in tagsToChange)
{
tag.TagText = proposedTagText;
}
dbContext.SaveChanges();
Посмотрите, насколько это проще, если у вас отдельная таблица тегов! Подумайте, сколько работы было бы, если бы вам пришлось проверять строки каждого уведомления!
О боже, теперь, когда мы изменили тег «sql» на «SQL», у нас есть несколько теги с одинаковым TagText. Убедитесь, что остался только один:
var tagsSql = dbContext.Tags
.Where(tag => tag.TagText == proposedTagText)
.ToList();
var tagToKeep = tagsSql.FirstOrDefault();
var tagsToRemove = tagsSql.Skip(1).ToList();
var notificationsToChange = dbContext.Tags
.Where(tag => tagIdsToRemove.Contains(tag))
.SelectMany(tag => tag.Notifications)
.Distinct();
foreach (var notification in notificationsToChange)
{
// remove all tagsToRemove from this notification
notification.Tags.RemoveRange(tagsToRemove);
// if this notification does not have tagToKeep, add it:
if (!notification.Contains(tagToKeep))
{
notification.Add(tagToKeep);
}
}
// now that no one uses TagsToRemove anymore, we can remove the tags:
dbContext.Tags.RemoveRange(tagsToRemove);
dbContext.SaveChanges();
Следующее даже невозможно в вашем методе конкатенированного строкового тега:
После переноса базы данных Тег имеет добавленное логическое свойство: IsObsolete, изначально установлено значение false.
Требование Дайте мне все уведомления с устаревшими тегами:
var notificationsWithObsoleteTags= dbContext.Tags
.Where(tag => tag.IsObsolete)
.SelectMany(tag => tag.Notifications);
Требование : удалите все устаревшие теги из ваших уведомлений
var obsoleteTags = dbContext.Tags.Where(tag => tag.IsObsolete).ToList();
dbContext.RemoveRange(obsoleteTags);
dbContext.SaveChanges();
Опять же: подумайте, сколько работы вам пришлось бы сделать, если бы у вас не было отдельной таблицы