【问题标题】:Cleanest syntax to delete a record in linqtosql在 linqtosql 中删除记录的最简洁语法
【发布时间】:2008-10-22 03:11:01
【问题描述】:

当我拥有主键时,使用 LINQ 删除数据库记录的最佳方法是什么?

【问题讨论】:

  • LINQ 与记录或数据库完全无关。您正在考虑使用 LINQ to SQL。
  • 这个问题具有误导性。听起来您担心使用效率低下这个词来提高性能。
  • 是的,我同意,这是一个考虑不周的问题。
  • @上面的评论:阅读问题 - “当我拥有主键时,使用 LINQ 删除数据库记录的最佳方法是什么?”......让 OP 的含义相当明显。跨度>
  • Kev,听说过编辑吗? :) cmets 的问题文本已过期。

标签: .net linq linq-to-sql


【解决方案1】:

如果您将所有列的更新检查设置为从不更改时,您只需附加一个带有主键的实例,然后删除没有加载的行。

public void DeleteCustomer(int CustomerID)
{
    NorthwindContext c = new NorthwindContext c;
    Customer target = new Customer(){CustomerID = CustomerID};
    c.Customers.Attach(target);
    c.Customers.DeleteOnSubmit(target);
    c.SubmitChanges();                       
}

【讨论】:

    【解决方案2】:

    这种方法是可以接受的并且是典型的。

    这有点浪费,因为您请求的是整个记录。鉴于 DeleteOnSubmit 方法签名,这是无法避免的。

    为什么 LINQ to SQL 以这种方式工作?如果您考虑没有主键或使用复合键的表,答案显而易见。 LINQ to SQL 在最坏的情况下需要整个记录,它需要将每个对象属性与表字段进行匹配。

    但是对于性能的所有问题都应该被问到 - 您绝对确定这对您来说是性能问题吗?你的分析证明在哪里?

    我还没有尝试过,但可能有一种方法可以使用DataContext.ExecuteCommand 实现同样的效果。

    【讨论】:

    • L2S 无法从没有主键的表中删除记录。
    【解决方案3】:

    我最终做了一个选择,但改进了我认为我真正关心的语法:

    旧:

    var products = from p in db.Products select p;
    db.Products.DeleteOnSubmit(products.Take(1).Single()); <--seemed nasty
    db.SubmitChanges();
    

    新:

    Service service = db.Services.Where(s => s.id == serviceID).FirstOrDefault(); <--nicer
    db.Services.DeleteOnSubmit(service);
    db.SubmitChanges();
    

    【讨论】:

    • 哦,你的意思是在语法上效率低下(即丑陋),而不是实际上效率低下......
    【解决方案4】:
      public static Delete(this ITable table, object key)
       { var t = table.GetType();
         var tableName  = t.GetCustomAttributes
                                        (typeof(TableAttribute),false)[0].Name;
         var primaryKey = (from p in t.GetProperties()
                           from c in p.GetCustomAttributes
                                                (typeof(ColumnAttribute),false)
                           where c.IsPrimaryKey
                           select c.Name).Single();
         using (var cmd = table.Context.Connection.CreateCommand())
          { cmd.CommandText = string.Format( "DELETE FROM {0} WHERE {1} = @key"
                                            ,tableName, primaryKey);
            cmd.Parameters.Add(new SqlParameter("@key", key));
            cmd.ExecuteNonQuery();        
          }            
       }
    
    /* ... */
    dataContext.Table1.Delete(id);
    

    【讨论】:

    • 这只是一个例子。如果您接受多个键和值作为参数并使用 ColumnAttributes 进行验证,则应该没问题。
    【解决方案5】:

    您可以将存储过程映射到 DataContext 上的方法,该方法删除具有给定主键值的记录。

    【讨论】:

      【解决方案6】:

      我一直使用选择删除方法,因为它非常简单。正如 marxidad 所说,如果你真的想的话,你可以映射一个存储过程。我相信 ESQL 有计划在未来支持插入、更新和删除操作。

      【讨论】:

        猜你喜欢
        • 2016-06-29
        • 2010-10-27
        • 1970-01-01
        • 2015-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-24
        相关资源
        最近更新 更多