2008-10-22 33 views
2

當我有主鍵時使用LINQ刪除數據庫記錄的最佳方法是什麼?最乾淨的語法來刪除linqtosql中的記錄

+0

LINQ與記錄或數據庫完全無關。您正在考慮LINQ to SQL。 – yfeldblum 2008-10-22 03:18:37

+0

這個問題有誤導性。聽起來你很擔心使用低效率這個詞。 – CVertex 2008-10-22 03:51:14

+0

是的,我同意,這是一個思路不清的問題。 – stimms 2008-10-22 03:58:28

回答

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

您可以將存儲過程映射到DataContext上的一個方法,該方法刪除具有主鍵給定值的記錄。

0

我一直使用select-delete方法,因爲它非常簡單。正如marxidad所說,如果你真的想要,你可以映射一個存儲過程。我相信ESQL有計劃在未來支持插入,更新和刪除操作。

2

該方法是可接受的和典型的。

這是有點浪費,因爲你要求整個記錄。考慮到DeleteOnSubmit方法簽名,這是無法避免的。

爲什麼LINQ to SQL以這種方式工作?如果您考慮沒有主鍵的表或者使用組合鍵,答案就很明顯。在需要將每個對象屬性與表字段進行匹配的最差情況下,LINQ to SQL需要整個記錄。

但正如應該問的所有性能問題 - 你絕對相信這是一個性能問題?你的簡介證明在哪裏?

我還沒有嘗試過,但可能有一種方法可以實現與DataContext.ExecuteCommand同樣的事情。

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