LINQ To SQL:使用一个查询删除实体(按ID)

17 c# sql linq

我一直在使用LINQ To SQL一段时间,当涉及从数据库中删除实体时,我总是调用表的.DeleteOnSubmit并传入实体.有时我发现自己写了类似的东西:

db.Users.DeleteOnSubmit(db.Users.Where(c => c.ID == xyz).Select(c => c).Single());
Run Code Online (Sandbox Code Playgroud)

这当然会导致两个查询.一个用于获取符合条件的实体,另一个用于删除它.通常我有我需要删除的记录的ID,我想知道是否有更直接的方法通过ID从表中删除行?

Chr*_*rds 5

这是一个解决方案......

public static void DeleteByPK<TSource, TPK>(TPK pk, DataContext dc)
  where TSource : class
{
  Table<TSource> table = dc.GetTable<TSource>();
  TableDef tableDef = GetTableDef<TSource>();

  dc.ExecuteCommand("DELETE FROM [" + tableDef.TableName
    + "] WHERE [" = tableDef.PKFieldName + "] = {0}", pk);
}
Run Code Online (Sandbox Code Playgroud)

这不是我的代码!请参阅解释 - http://msmvps.com/blogs/omar/archive/2008/10/30/linq-to-sql-delete-an-entity-using-primary-key-only.aspx

希望这可以帮助.

  • 在Linq2Sql语句中的行SQL似乎打败了目的 (7认同)
  • @Bobby:不是.我在行SQL中使用性能和需要时(复杂的SQL).继续SQL生成以进行常见操作. (3认同)

小智 5

通过附加部分对象并删除它,无需手动工具SQL即可执行此操作:

var myEntity = new MyEntityType { MyEntityId = xxx };
Context.MyEntityTypeTable.Attach(myEntity, false);
Context.MyEntityTypeTable.DeleteOnSubmit(myEntity);
Context.SubmitChanges();
Run Code Online (Sandbox Code Playgroud)

简单.您甚至可以将其作为扩展方法编写,并使用动态对象类型来表示键,并使用反射来确定关键属性,我将留给读者作为有趣的练习.例如实现Context.Delete(new {MyEntityId = xxx});


Ada*_*sek 0

我不相信 Linq to Sql 可以本地执行此操作,尽管编写存储过程可以为您提供所需的内容,其语法如下:

db.spDeleteUserById(id);
Run Code Online (Sandbox Code Playgroud)

这需要为每个表编写一个存储过程,但这是相当少量的 SQL。


查看这篇博文,其中作者创建了一个扩展方法,可以生成自己的删除语句。您也许能够采用这个概念并使用它来创建不需要选择的删除例程。缺点是,您最终可能会得到特定于您自己的架构的扩展方法。

我知道您希望将逻辑置于数据库层之外,但在这种情况下,我认为采用存储过程路线会简单得多。它不会受到紧密耦合的数据访问逻辑的问题的影响,因为按 id 删除行不太可能需要重构。