Solved

c# Linq statement needed to delete records from 2 tables

Posted on 2010-11-16
10
919 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 142 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 215 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
 
LVL 52

Assisted Solution

by:Carl Tawn
Carl Tawn earned 142 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
DevOps Toolchain Recommendations

Read this Gartner Research Note and discover how your IT organization can automate and optimize DevOps processes using a toolchain architecture.

 
LVL 10

Assisted Solution

by:Mathiyazhagan
Mathiyazhagan earned 143 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 215 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 215 total points
ID: 34144698
use one datacontext
0
 
LVL 10

Assisted Solution

by:Mathiyazhagan
Mathiyazhagan earned 143 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

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

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

Suggested Solutions

International Data Corporation (IDC) prognosticates that before the current the year gets over disbursing on IT framework products to be sent in cloud environs will be $37.1B.
Real-time is more about the business, not the technology. In day-to-day life, to make real-time decisions like buying or investing, business needs the latest information(e.g. Gold Rate/Stock Rate). Unlike traditional days, you need not wait for a fe…
This Micro Tutorial will give you a basic overview how to record your screen with Microsoft Expression Encoder. This program is still free and open for the public to download. This will be demonstrated using Microsoft Expression Encoder 4.
Both in life and business – not all partnerships are created equal. As the demand for cloud services increases, so do the number of self-proclaimed cloud partners. Asking the right questions up front in the partnership, will enable both parties …

910 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

Need Help in Real-Time?

Connect with top rated Experts

18 Experts available now in Live!

Get 1:1 Help Now