将linq中的记录删除为sql的最简洁语法

时间:2008-10-22 03:11:02

标签: .net linq linq-to-sql

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

6 个答案:

答案 0 :(得分:2)

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

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

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

但是应该问一下所有关于性能的问题 - 你绝对相信这对你来说是一个性能问题吗?你的剖析证明在哪里?

我还没有尝试过,但可能有办法用DataContext.ExecuteCommand实现同样的目的。

答案 1 :(得分:2)

如果您将所有列上的更新检查设置为从不更改后,则只需使用主键附加实例即可删除没有加载的行。

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 :(得分:1)

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

旧:

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();

答案 3 :(得分:1)

  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);

答案 4 :(得分:0)

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

答案 5 :(得分:0)

我一直使用select-delete方法,因为它很直接。正如marxidad所说,如果你真的想要,你可以映射一个存储过程。我相信ESQL有计划在未来支持插入,更新和删除操作。