当我有主键时,使用LINQ删除数据库记录的最佳方法是什么?
答案 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有计划在未来支持插入,更新和删除操作。