I wish I had kept my reference material on this, so if anyone recognizes borrowed code here, please let me know…
The basic idea is, I needed to “copy” a SQL record within the same table, avoiding some fields. With SQL this could be accomplished with something like:
INSERT INTO ShippingInfo (Name,Value) SELECT Name,Value FROM ShippingInfo where id=5
But imagine there are 20 fields or so. I couldn’t find a native way to do this with LINQ. What I came up with is an object shallow copy with the ability to punch out (omit) fields by name. Here’s the method:
public static class AnyObject<t> where T : class, new() { public static T ShallowCopy(T item) { return ShallowCopy(item, ""); } public static T ShallowCopy(T item, string OmitPropeties) { if (item == null) { return null; } T newItem = new T(); foreach (System.Reflection.PropertyInfo prop in item.GetType().GetProperties()) { if ((prop.PropertyType.IsValueType || prop.PropertyType.Name == "String") && !prop.PropertyType.Name.StartsWith("EntitySet") && !("|"+OmitPropeties+"|").ToLower().Contains("|"+prop.Name.ToLower()+"|")) { System.Reflection.PropertyInfo prop2 = item.GetType().GetProperty(prop.Name); prop2.SetValue(newItem, prop.GetValue(item, null), null); } } return newItem; } }
Then you call it like…
// get the source record ShippingInfo TempShipping; TempShipping = (from s in db.ShippingInfos where s.Id == tempShippingId select s).FirstOrDefault(); // shallow copy the object ShippingInfo NewShipping = Helpers.AnyObject<shippinginfo>.ShallowCopy(TempShipping, "Id|ModifiedBy|ModifiedTime"); // override some copied fields NewShipping.CreatedBy = PageContext.UserId; NewShipping.CreatedTime = DateTime.Now; // insert it db.ShippingInfos.InsertOnSubmit(NewShipping); db.SubmitChanges();