2009-08-24 15 views
12

我是非常新的linq到SQL,我不知道如何实际删除记录。如何在linq中删除sql?

所以,我一直在研究这个教程

http://weblogs.asp.net/scottgu/archive/2007/05/19/using-linq-to-sql-part-1.aspx

所以对于更新他们

NorthwindDataContext db = new NorthwindDataContext(); 

Product product = db.Products.Single(p => p.ProductName == "Toy 1"); 

product.UnitPrice == 99; 
product.UnitsInStock = 5; 

db.SubmitChanges(); 

对于删除他们

NorthwindDataContext db = new NorthwindDataContext(); 

var toyProducts = from p in db.Producsts 
       where p.ProductName.Contains("Toy") 
        select p; 

db.Products.RemoveAll(toyProducts); 

db.SubmitChanges(); 

所以我必须查询每时间,以获取记录以删除该记录?就像我可以看到这样做与更新,因为你需要给它一个记录,先更新,然后进行更改,所以我理解查询部分,但不删除。

就像你不能只发送你想要删除的东西,它会删除它并删除它?为什么你必须先得到它,然后告诉它被删除?

这是不是在数据库上2击?

另外我有外键关系,我试图去工作。所以我有这个

public ViewResult(string param1, string param2) 
{ 
    Table A = new Table A 
    A.Field1 = param1; 
    A.Field2 = param2; 

    Delete(A); 
} 

private void Delete(Table A) 
{ 
    DbContext.A.DeleteAllOnsubmit(A.TableB); 
    DbContext.A.DeleteAllOnSubmit(A.TableC); 
    DbContext.A.DeleteOnSubmit(A); 

} 

所以这个失败它会出现这个消息“无法删除未连接的实体”。

因此,我可以看到为什么前两行会在删除方法失败,因为我做了一个新的对象,它们没有任何关于TableB和TableC的任何信息的对象。

但是,我不明白为什么最后一行仍然失败,即使其他2行不在那里。

就像我认为它会工作,它将需要我的表一个类对象,我传入并查看表中的信息包含在其中。但似乎并非如此。

那么我首先必须拿出信息,然后做一个查询来获得它,然后删除它,就像在这个例子中一样?

removeAll()和DeleteAllOnSubmit()之间有什么区别。

就像我说过的,我是linq to sql的新手,并且由于时间限制,无法坐下来阅读书籍。一旦我有更多的时间,我可能会通读一本书。

感谢

回答

13

您的一个问题的几个问题,但我会用最简单的开始,有关附加,如果你已经有主键。如果你没有主键,那么我总是只进行一次提取然后删除,但是每当我进行一次提取时,我都倾向于存储更新和删除的主键。

它将从主键删除,但如果你有这个,那么就像我下面做的那样附加并调用delete。我不会传递DLINQ所需的对象,因为我希望能够根据需要更改它,所以我传入不同的User对象,并从业务类中提取PK并将其放入DAO类。

var db = new MeatRequestDataContext();    
if (input.UserID > 0) 
{ 
    entity = new User() 
    { 
     UserID = input.UserID 
    }; 
    db.Users.Attach(entity); 
    db.Users.DeleteOnSubmit(entity); 
} 
+0

我试过这个,但它似乎尝试使用对象上的所有值来定位记录。它没有找到或已更改行错误。想法? – drizzie 2015-03-06 21:26:39

+0

@drizzie - 你只把钥匙放进你的实体实例吗? – 2015-03-07 01:16:48

+0

是的,我的代码与您的代码完全相同。 – drizzie 2015-03-09 13:53:22

2
 SupportDataDataContext Retrive = new SupportDataDataContext(); 
     // SupportDataDataContext delete = new SupportDataDataContext(); 

     Topic res = Retrive.GetTable<Topic>().Single(t => t.ID == topicID); 


     if (res != null) 
     { 
      Retrive.Topics.DeleteOnSubmit(res); 
      Retrive.SubmitChanges(ConflictMode.ContinueOnConflict); 
     } 
2
Inserted_LINQDataContext db = new Inserted_LINQDataContext(); 
       Item itm = new Item(); 
       int ID = Convert.ToInt32(TextBox1.Text); 
       var DeleteID = from d in db.Items 
           where d.id == ID 
           select d; 
       db.Items.DeleteAllOnSubmit(DeleteID); 
       db.SubmitChanges(); 
       Label2.Text = "Record deleted Successfully."; 
       TextBox1.Text = ""; 

,其中项目是表名,Linserted_LINQDataContext是你的Linq DB姓名,身份证是在项目表中的列名。 Items是linq中Item表的别名。