我有一個圖像站點,用戶可以標記照片,就像你可以在Stackoverflow上標記問題一樣。如何編寫LINQ to SQL查詢來更新標籤?
我有以下表格:
Images [ID, URL, etc]
Tags [ID, TagName]
ImageTag [TagID, ImageID]
我想寫帶有簽名的方法:
public void UpdateImageTags(int imageId, IEnumerable<string> currentTags)
此方法將做到以下幾點:
- 創建任何新當前標籤中的標籤不存在於標籤表中。
- 獲取圖像的舊ImageTag。
- 刪除currentTags中不存在的任何ImageTag
- 添加在當前標籤和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.
有沒有e asier我可以處理添加新標籤,刪除舊ImageTags,添加新的ImageTags到LINQ to SQL的操作?
多少標籤TE數據庫存在嗎?這將是一個關鍵因素之間「閱讀所有標籤從數據庫和比較」vs「查詢每個項目」 –
@Marc Gravell,可能會有成千上萬的標籤。也許超過10K,少於50K?總猜測。它仍在發展中,我們已經有近千個了。 – Viktor
在服務器端,TSQL不能做到嗎? –