我有一个图像网站,用户可以在其中标记照片,就像您可以在 Stackoverflow 上标记问题一样。
我有以下表格:
Images [ID, URL, etc]
Tags [ID, TagName]
ImageTag [TagID, ImageID]
我想写一个带有签名的方法:
public void UpdateImageTags(int imageId, IEnumerable<string> currentTags)
此方法将执行以下操作:
- 在标签表中尚不存在的 currentTags 中创建任何新标签。
- 获取图像的旧 ImageTag。
- 删除当前标签中不再存在的任何 ImageTag
- 在 currentTags 和 oldTags 之间添加任何新的 ImageTag。
这是我对该方法的尝试:
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);
出现错误:
Local sequence cannot be used in LINQ to SQL implementations of query operators except the Contains operator.
在 LINQ to SQL 中,有没有一种更简单的方法可以处理添加新标签、删除旧 ImageTag、添加新 ImageTag 的操作?
最佳答案
这似乎是最简单的
public void UpdateImageTags(int imageId, IEnumerable<string> currentTags)
{
using (var db = new ImagesDataContext())
{
var image = db.Images.Where(it => it.ImageId == imageId).First()
image.Tags.Clear();
foreach(string s in currentTags)
{
image.Tags.Add(new Tag() { TagName = s});
}
db.SubmitChanges();
}
}
对于 LinqtoSQL,这可能需要稍微修改。 EF 是我最近一直在使用的。这也取决于启用延迟加载。如果不是,您将不得不强制包含图像标签。
关于c# - 如何编写 LINQ to SQL 查询来更新标签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7052318/