【问题标题】:Delete From Table Where Column "In" range - Simple.Data从列“在”范围内的表中删除 - Simple.Data
【发布时间】:2015-02-01 02:21:09
【问题描述】:

我正在使用 Simple.Data 作为我的 Micro-ORM,我想实现一些可能或不可能实现的目标.. 我想对其中一列与变量列表匹配的表进行删除,因此有效地 SQL 将类似于:

DELETE FROM [Albums] WHERE Genre IN ("Rock", "Pop")

这可能吗?我尝试了一些方法,例如:

db.Albums.DeleteByGenre(new[] { "Rock", "Pop" });
db.Albums.DeleteAll(db.Albums.Genre == new[] { "Rock", "Pop" });

var genres = new List<string> { "Rock", "Pop" }
db.Albums.DeleteAll(db.Albums.Genre == genres);

不运行,因为在运行 SQL 配置文件时我看不到任何生成的查询。开始认为唯一的选择是逐一循环调用DeleteBy 的流派集合?

编辑:

我遇到的问题不是 Simple.Data 问题。以上将起作用,我使用过:

var genreList = new List<string> { "Rock", "Pop" };
db.Albums.DeleteByGenre(genreList);

您也可以使用:

db.Albums.DeleteAll(db.Albums.Genre == genreList);

我个人更喜欢第一个选项:)

【问题讨论】:

  • 不确定 Simple.Data 是否支持它,但逻辑上等同于 IN ("Rock", "Pop") 将是 db.Albums.DeleteAll(genres.Contains(db.Albums.Genre))
  • 查看我对 Stefan 的评论,它也适用于这个建议。谢谢:)
  • 更新了我的答案。似乎我遇到了另一个问题

标签: c# sql orm simple.data


【解决方案1】:

我没有测试过,但是你可以像这样使用 Array.contains 方法:

string[] genresToDelete = new[] { "Rock", "Pop" };
db.Albums.DeleteAll(genresToDelete.Contains(db.Albums.Genre));

我不能 100% 确定创建语句的智能程度,但我强烈建议您在语句之前定义数组并直接使用它(而不是为表的每条记录定义它)。另外,我认为这样更具可读性:)

【讨论】:

  • 感谢您的回复。不过,这似乎不对。 "genresToDelete(db.Albums.Genre)" 肯定会返回一个布尔值吗?意思是我会打电话给 db.Albums.DeleteAll(true); - 似乎不正确。此外 .Contains(..) 只能接受一个字符串,而不是一个集合 - 所以如果有多个类型,我们将有无效的参数错误。感谢您的帮助!
  • 更新了我的答案。似乎我遇到了另一个问题
  • 嗨!好吧,我没有使用 Simple.Data 的经验。根据文档,它可以以这种方式工作:) 请注意,我已经编写了genresToDelete.CONTAINS!我的想法是:对于每个 db.Albums.Genre:检查genresToDelete-Array 是否包含该类型。如果存在与参数相等的数组元素,则 contains 方法返回 true。我没有测试它,所以它可能是错误的;)无论如何,我很高兴它现在可以工作并且你解决了这个问题。感谢您的编辑和有关它的信息!!! :-)
猜你喜欢
  • 2018-05-27
  • 2012-06-03
  • 2017-08-22
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多