Solved

c# Linq statement needed to delete records from 2 tables

Posted on 2010-11-16
10
925 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
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 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
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 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
 
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

Major Incident Management Communications

Major incidents and IT service outages cost companies millions. Often the solution to minimizing damage is automated communication. Find out more in our Major Incident Management Communications infographic.

Question has a verified solution.

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

Suggested Solutions

Many of us here at EE write code. Many of us write exceptional code; just as many of us write exception-prone code. As we all should know, exceptions are a mechanism for handling errors which are typically out of our control. From database errors, t…
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 …
With Secure Portal Encryption, the recipient is sent a link to their email address directing them to the email laundry delivery page. From there, the recipient will be required to enter a user name and password to enter the page. Once the recipient …
This video shows how to use Hyena, from SystemTools Software, to update 100 user accounts from an external text file. View in 1080p for best video quality.

739 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