Solved

c# Linq statement needed to delete records from 2 tables

Posted on 2010-11-16
10
915 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
Find Ransomware Secrets With All-Source Analysis

Ransomware has become a major concern for organizations; its prevalence has grown due to past successes achieved by threat actors. While each ransomware variant is different, we’ve seen some common tactics and trends used among the authors of the malware.

 
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

How your wiki can always stay up-to-date

Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
- Increase transparency
- Onboard new hires faster
- Access from mobile/offline

Join & Write a Comment

This article describes relatively difficult and non-obvious issues that are likely to arise when creating COM class in Visual Studio and deploying it by professional MSI-authoring tools. It is assumed that the reader is already familiar with the cla…
User art_snob (http://www.experts-exchange.com/M_6114203.html) encountered strange behavior of Android Web browser on his Mobile Web site. It took a while to find the true cause. It happens so, that the Android Web browser (at least up to OS ver. 2.…
Excel styles will make formatting consistent and let you apply and change formatting faster. In this tutorial, you'll learn how to use Excel's built-in styles, how to modify styles, and how to create your own. You'll also learn how to use your custo…
This video demonstrates how to create an example email signature rule for a department in a company using CodeTwo Exchange Rules. The signature will be inserted beneath users' latest emails in conversations and will be displayed in users' Sent Items…

759 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

22 Experts available now in Live!

Get 1:1 Help Now