У меня есть сайт с изображениями, где пользователи могут отмечать фотографии так же, как вы можете пометить вопрос в Stackoverflow.
У меня есть следующие таблицы:
Images [ID, URL, etc]
Tags [ID, TagName]
ImageTag [TagID, ImageID]
Я хочу написать методс подписью:
public void UpdateImageTags(int imageId, IEnumerable<string> currentTags)
Этот метод будет выполнять следующие действия:
- Создать любые новые теги в currentTags, которые еще не существуют в таблице тегов.
- Получить старый ImageTag для изображения.
- Удалить любые теги ImageTag, которые больше не существуют в currentTags
- Добавить любые теги ImageTag, которые являются новыми между currentTags и oldTags.
Здесьмоя попытка этого метода:
public void UpdateImageTags(int imageId, IEnumerable<string> currentTags)
{
using (var db = new ImagesDataContext())
{
var oldTags = db.ImageTags.Where(it => it.ImageId == imageId).Select(it => it.Tag.TagName);
var added = currentTags.Except(oldTags);
var removed = oldTags.Except(currentTags);
// Add any new tags that need created
foreach (var tag in added)
{
if (!db.Tags.Any(t => t.TagName == tag))
{
db.Tags.InsertOnSubmit(new Tag { TagName = tag });
}
}
db.SubmitChanges();
// Delete any ImageTags that need deleted.
var deletedImageTags = db.ImageTags.Where(it => removed.Contains(it.Tag.TagName));
db.ImageTags.DeleteAllOnSubmit(deletedImageTags);
// Add any ImageTags that need added.
var addedImageTags = db.Tags.Where(t => added.Contains(t.TagName)).Select(t => new ImageTag { ImageId = imageId, TagId = t.TagId });
db.ImageTags.InsertAllOnSubmit(addedImageTags);
db.SubmitChanges();
}
}
Однако, это не удается на линии:
db.ImageTags.DeleteAllOnSubmit(deletedImageTags);
С ошибкой:
Локальная последовательность не может бытьиспользуется в реализациях операторов запросов LINQ to SQL, кроме оператора Contains.
Есть ли более простой способ обработки операции добавления новых тегов, удаления старых тегов ImageTags, добавления новых тегов ImageTags в LINQ to SQL?