I ran into an issue with my latest project at work that uses LINQ. I was upserting some entities and when I encountered a duplicate, I queried the database, but not the pending inserts of my DataContext, so my import failed with "duplicate primary key" type of error.
It turns out it's fairly easy to query those pending inserts too.
Lets have a DataContext and do an insert of a new Color entity:
DataContext dc = new DataContext();
dc.Colors.InsertOnSubmit(new Color() { Code = "F0F8FF", Name = "AliceBlue" });
Since we didn't do dc.SubmitChanges(), the following query returns nothing:
var r = from c in dc.Colors where c.Code = "F0F8FF" select c;
Enter GetChangeSet(). Let's count inserts:
int allPendingInserts = dc.GetChangeSet().Inserts.Count();
But we can have pending inserts of different types/tables. Let's just count pending colors:
int colorsPendingInserts = dc.GetChangeSet().Inserts.OfType(Color).Count();
And now we are not very far from querying inserted records:
IEnumerable<Color> insertedColors = dc.GetChangeSet().Inserts.OfType<Color>();
Console.WriteLine(
string.Format(
"Q: Is color #F0F8FF already pending insert?\n" +
"A: {0}",
(from q in insertedColors where q.Code == "F0F8FF" select q).Count > 0));
Did I mention I really like LINQ? (except when crossing WCF, of course)