c# - 如何编写 LINQ to SQL 查询来更新标签?

标签 c# linq-to-sql tagging

我有一个图像网站,用户可以在其中标记照片,就像您可以在 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/

相关文章:

python - NLP中简化标签的定义?

c# - 如何获取带有测试结果的标准 xUnit v2 XML 文件

c# - 带连字符的 html 属性与 asp.net mvc

c# - 如何在 C# 中使用 win2D.uwp 将文本写入图像时旋转文本?

c# - 链接到 View 中的不同 Controller

c# - 如何使用 LINQ 在函数中定义返回类型?

python - Django 标记迁移到 GAE

c# - MyDataContext.dbml 下的 .cs 文件是做什么用的?

C# 将 Table<T> 添加到现有 DataContext 实例中

python - DRF ModelMultipleChoiceFilter - 许多参数之一中的无效值导致空列表