entity framework - How do I Mapout 1D object value into 2D object property value C# EF6 WCF Is there a better or simpler way than what I am doing? -
i using entity framework v6, wcf, , windowsforms: trying map out 1d object value property of collection of myobjectdto makes 3d (maybe 2d) object space (defined rows, columns ) datatables came mind entity framework has entities not tables!
i have array of items[1..n] returned me 3rd party component , each element of array represents property in dto , can 1 or 2000 items.
i trying map items[x] property of given dto in collection keyedlist items[n] has object keyid defined class called keyid 3 properties parent, uniqueid, propertyname - set when instantiated - lifetime (basically long application run out crashing) must remain same!
i have following code not sure if correct approach, long approach or wrong approach. serious experts @ code , tell me if there better way or simpler way this.
// 1 of dto's different dto's class mydtoobject { bool property1 {get; set;} bool property2 {get; set;} int property3 {get; set;} string property4 {get; set;} float property5 {get; set;} string property6 {get; set;} } keyid { guid parent {get; set;} guid uniqueid {get; set;} string propertyname {get; set;} } keyedlist<mydto> mydtolist keyedlist<mydto> // itemvalues[] 1 n not same or same items. otherguysobjectschanged(itemvalues[] items) { for(int i=0; < items.length; i++) { // object items.keyid keyid = (keyid)items[i].keyid; myinstancedtoobject = mydtolist[keyid.parent]; if(myinstancedtoobject != null) { var setvalues = setvalues[items[i].keyid.propertyname]; setvalues(myinstancedtoobject, items[i].value); mydtolist[keyid.parent] = myinstancedtoobject; } } // call thread push stuff wcf clients. // maybe every .250 seconds transform list simple list if need . // call thread entityframework stuff , take list of dto's // has changed , update db . } dictionary<string,action<mydtoobject, object> setvalues = new dictionary<string,action<mydtoobject, object>() { {"property1", (m,v) => m.property1 = (bool)v.value}, {"property2", (m,v) => m.property2 = (bool)v.value}, {"property3", (m,v) => m.property3 = (int)v.value}, {"property4", (m,v) => m.property4 = (string)v.value}, {"property5", (m,v) => m.property5 = (float)v.value}, {"property6", (m,v) => m.property6 = (string)v.value} ; } // keyedlist<t> // found ilist implementation on web , modified addition of dictionary //- hoping able push list wcf client , update datagridview it. using system; using system.collections.generic; using system.runtime.serialization; using system.text; namespace utility.collections { public class keyedlist<t> : ilist<t> { internal list<t> _innerlist; private list<t> innerlist { { return _innerlist; } set { _innerlist = value; oninnerlistchanged(eventargs.empty); } } public event eventhandler innerlistchanged; /// <summary> /// inner list changed event /// </summary> /// <param name="e"></param> protected virtual void oninnerlistchanged(eventargs e) { var handler = innerlistchanged; if (handler != null) { handler(this, e); } } private ienumerable<t> _keyedloader; internal ienumerable<t> keyedloader { { return _keyedloader; } set { _keyedloader = value; } } [ignoredatamember] [nonserialized] private dictionary<object, int> _itemlookup; [ignoredatamember] internal dictionary<object, int> itemlookup { { return _itemlookup; } set { _itemlookup = value; } } /// <summary> /// /// </summary> private void ensurelist() { if(innerlist == null) { innerlist = new list<t>(keyedloader); //_itemlookup = new dictionary<object, int>(); } if(itemlookup == null) { _itemlookup = new dictionary<object, int>(); } } /// <summary> /// /// </summary> private void refreshdictionary() { ensurelist(); (int = 0; < this.itemlookup.count; i++) { itemlookup = new dictionary<object, int>(); itemlookup[innerlist[i]] = i; } } #region ilist<t> members public int indexof(t item) { ensurelist(); return innerlist.indexof(item); } public void insert(int index, t item) { ensurelist(); innerlist.insert(index, item); refreshdictionary(); } public void removeat(int index) { ensurelist(); innerlist.removeat(index); refreshdictionary(); } public t this[int index] { { ensurelist(); return innerlist[index]; } set { ensurelist(); innerlist[index] = value; itemlookup[value] = index; } } /// <summary> /// ?will throw exception if key not exist! /// </summary> public t this[object key] { { ensurelist(); return innerlist[itemlookup[key]]; } set { ensurelist(); if (itemlookup.containskey(value)) { innerlist[itemlookup[key]] = value; } else { innerlist.add( (t)activator.createinstance( typeof(t) ) ); itemlookup[key] = innerlist.count-1; // throw new argumentoutofrangeexception(string.format("{0}", "key"), // "key not found in dictionary cannot set value"); } } } #endregion #region icollection<t> members public void add(t item) { ensurelist(); innerlist.add(item); } public void clear() { ensurelist(); innerlist.clear(); } public bool contains(t item) { ensurelist(); return innerlist.contains(item); } public void copyto(t[] array, int arrayindex) { ensurelist(); innerlist.copyto(array, arrayindex); } public int count { { ensurelist(); return innerlist.count; } } public bool isreadonly { { return false; } } public bool remove(t item) { ensurelist(); bool retval = innerlist.remove(item); refreshdictionary(); return retval; } #endregion #region ienumerable<t> members public ienumerator<t> getenumerator() { ensurelist(); return innerlist.getenumerator(); } #endregion #region ienumerable members system.collections.ienumerator system.collections.ienumerable.getenumerator() { ensurelist(); return innerlist.getenumerator(); } #endregion } }
do 2 objects have same properties? if so, recommend use automapper. eliminates manual , tedious mapping dto other models. can install using nuget typing install-package automapper in nuget package manager.
Comments
Post a Comment