Go Premium for a chance to win a PS4. Enter to Win

x
?
Solved

c# Linq statement needed to delete records from 2 tables

Posted on 2010-11-16
10
Medium Priority
?
930 Views
Last Modified: 2013-12-17


Say I have to tables that are related by and ID (int) in a one to many join.   I want a linq statement to delete the one row with a certain ID in the “masterTable” and all the child records with the same ID in the “ChildTable”

MasterTable
ID int
Name varchar(100)

ChildTable
ID int
Region varchar(100)



0
Comment
Question by:ToString1
  • 3
  • 3
  • 2
  • +1
10 Comments
 
LVL 52

Assisted Solution

by:Carl Tawn
Carl Tawn earned 568 total points
ID: 34144322
Can you modify the table schema? Because this sort of thing would be better implemented as a cascade delete rule on your tables.
0
 
LVL 5

Assisted Solution

by:roxviper
roxviper earned 860 total points
ID: 34144386
Hi,

Here is an example of mine:

            
InvoicerDataContext db = new InvoicerDataContext();
            var costCenter = db.CostCenters.SingleOrDefault(q => q.CostCentersID == CostCenterID);
            if (costCenter != null)
            {
                var invoices = db.Invoices.Where(q => q.CostCenterID == CostCenterID);
                db.Invoices.DeleteAllOnSubmit(invoices);
                db.SubmitChanges();

                db.CostCenters.DeleteOnSubmit(costCenter);
                db.SubmitChanges();
            }

Open in new window

0
 

Author Comment

by:ToString1
ID: 34144407
OK thanks

Yes I already have a cascade delete rule in my database schema but have not written any code yet
0
Veeam Disaster Recovery in Microsoft Azure

Veeam PN for Microsoft Azure is a FREE solution designed to simplify and automate the setup of a DR site in Microsoft Azure using lightweight software-defined networking. It reduces the complexity of VPN deployments and is designed for businesses of ALL sizes.

 
LVL 52

Assisted Solution

by:Carl Tawn
Carl Tawn earned 568 total points
ID: 34144431
If you have a cascade rule then you only need to delete the header record, the cascade will take the related child records with it.
0
 

Author Comment

by:ToString1
ID: 34144482
I have tried the code above but get the error

Cannot remove an entity that has not been attached

It appears to remove child records but not master record
0
 
LVL 10

Assisted Solution

by:Mathiyazhagan
Mathiyazhagan earned 572 total points
ID: 34144483
hi, have attached comprehensive linq query to delete master and child records. but, LINQ needs each table should have primary key to Delete operation.that is , assumption of my query is, ID is primary key of Master table and child table has ChildID field as primary key field.


hope this helps.
int MasterIDToDelete =2;
//select and delete all child records
var ChildsToDelete = from  child  in db.Childtable  
          join master in db.Mastertable on child.ID equals master.ID
		  where master.ID == MasterIDToDelete
		  select child ;
db.Childtable.DeleteAllOnSubmit(ChildsToDelete);
db.SubmitChanges();
// select single master record and delete
var MasterToDelete = (from master in db.Mastertable  
				where master.ID == MasterIDToDelete 
				select master).Single();
db.Mastertable.DeleteOnSubmit(MasterToDelete);
db.SubmitChanges();

Open in new window

0
 
LVL 5

Accepted Solution

by:
roxviper earned 860 total points
ID: 34144501
try to let only the code for deleting a single record and see if gives error
0
 

Author Comment

by:ToString1
ID: 34144673
Hi the code posted by roxviper does delete the "many" table records but not the master.

It is to do with being attached to two different data contexts
0
 
LVL 5

Assisted Solution

by:roxviper
roxviper earned 860 total points
ID: 34144698
use one datacontext
0
 
LVL 10

Assisted Solution

by:Mathiyazhagan
Mathiyazhagan earned 572 total points
ID: 34152324
you can also directly delete child records filtered by child.ID = MasterIDToDelete and no need of join also...
int MasterIDToDelete =2;
//select and delete all child records
var ChildsToDelete = from  child  in db.Childtable  
          	  where child.ID == MasterIDToDelete
		  select child ;
db.Childtable.DeleteAllOnSubmit(ChildsToDelete);
db.SubmitChanges();
// select single master record and delete
var MasterToDelete = (from master in db.Mastertable  
				where master.ID == MasterIDToDelete 
				select master).Single();
db.Mastertable.DeleteOnSubmit(MasterToDelete);
db.SubmitChanges();

Open in new window

0

Featured Post

Concerto's Cloud Advisory Services

Want to avoid the missteps to gaining all the benefits of the cloud? Learn more about the different assessment options from our Cloud Advisory team.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Introduction This article shows how to use the open source plupload control to upload multiple images. The images are resized on the client side before uploading and the upload is done in chunks. Background I had to provide a way for user…
Problem Hi all,    While many today have fast Internet connection, there are many still who do not, or are connecting through devices with a slower connect, so light web pages and fast load times are still popular.    If your ASP.NET page …
In response to a need for security and privacy, and to continue fostering an environment members can turn to for support, solutions, and education, Experts Exchange has created anonymous question capabilities. This new feature is available to our Pr…
Are you ready to place your question in front of subject-matter experts for more timely responses? With the release of Priority Question, Premium Members, Team Accounts and Qualified Experts can now identify the emergent level of their issue, signal…
Suggested Courses

972 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question