【问题标题】:How to delete DB records without loading them into memory in LINQPad?如何删除数据库记录而不将它们加载到 LINQPad 中的内存中?
【发布时间】:2023-02-16 11:12:28
【问题描述】:

LINQPad 允许像这样从数据库中删除记录

var ids = new [] { 1, 2, 3 ... N };
var records = Table.Where(t => ids.Contains(t.Id)).ToList();

Table.DeleteAllOnSubmit(records);
SubmitChanges();

但是,如果需要按 ID 删除,则加载 N 条记录是多余的。

安装 EF 或其他包?没有原生方法?

@JoeAlbahari?

【问题讨论】:

  • 是为了querying ..它不支持数据操作。
  • 根据你的逻辑@mat-j,为什么 LinQ 允许 Delete(All)OnSubmit 和 Insert 呢?是的,为什么这个酷儿工具允许更新?
  • 如果您使用的是 Linq2Sql,那么您可以查看 LinqPost nuget 包。
  • @svonidze - LINQ 不是 LINQ2SWL 也不是 EF。这些是对 LINQ 的补充。
  • @svonidze,那些不是 linq。所以你正在寻找一个函数而不是 linq 选项来删除?

标签: c# linqpad


【解决方案1】:

使用这些 ID 创建实体并将它们附加到表中。进行删除查询后。

var ids = new[] { 1, 2, 3... N };

var records = ids.Select(x => new Record { Id = x }).ToArray(); // entity in Table

Table.AttachAll(records);

Table.DeleteAllOnSubmit(records);
SubmitChanges();

【讨论】:

    【解决方案2】:

    您实际上并没有加载示例中的所有内容。在您调用ToList() 之前,不会对数据库执行 SQL,此时在生成 SQL 语句时会考虑所有先前的条件。在你的例子中,它可能会变成类似

    SELECT id, ... FROM Table where id in (1, 2, 3)
    

    意思是(假设ids 是唯一的)无论实际表中有多少行,您都只会得到三行。


    如果您只有一小部分 ID,您可以通过在语言下拉列表中选择它来直接将 SQL 输入 LinqPad。

    delete from Table where id in (1, 2, 3);
    

    或者您可以将 SQL 删除语句生成为字符串并使用 ExecuteCommand 对数据库执行它。

    恐怕我还没有找到比这更简单的删除记录的方法。

    【讨论】:

    • 为了清楚起见,我用 N 条记录替换了“一切”。 “直接 SQL”肯定是一种方式,但我只想使用 C#。谢谢您的回答。
    【解决方案3】:

    在 EF Core 7.0 中,使用 ExecuteDelete

    var ids = new[] { 1, 2, 3, 4, 5, 6 };
    var records = Temps.Where(t => ids.Contains(t.ID))
                    .ExecuteDelete();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-27
      • 1970-01-01
      • 1970-01-01
      • 2010-11-21
      • 1970-01-01
      • 1970-01-01
      • 2014-02-22
      • 2021-08-16
      相关资源
      最近更新 更多