Hello Brandon,
this is a bug in our implementation for the Search<T> method in the DataManager class. So please first replace the code of the following method in the DataManager class:
001.public List<T> SearchEntities<T>(T searchParameters)
002.
003.{
004.
005. var parameters = new List<KeyValuePair<string, object>>();
006.
007.
008.
009. string typeName = typeof(T).Name;
010.
011. Telerik.OpenAccess.Metadata.MetaPersistentType type =
012.
013. this._openAccessContext.Metadata.PersistentTypes.FirstOrDefault(
014.
015. t => t.Name.Equals(typeName));
016.
017.
018.
019. if (type == null || searchParameters == null)
020.
021. {
022.
023. return new List<T>();
024.
025. }
026.
027.
028.
029. foreach (var item in typeof(T).GetProperties(
030.
031. BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public))
032.
033. {
034.
035. try
036.
037. {
038.
039. Telerik.OpenAccess.Metadata.MetaMember member =
040.
041. type.Members.FirstOrDefault(p => p.PropertyName.Equals(item.Name));
042.
043.
044.
045.
046.
047. bool isMetaPrimitiveMember = member is Telerik.OpenAccess.Metadata.MetaPrimitiveMember;
048.
049.
050.
051. if (isMetaPrimitiveMember)
052.
053. {
054.
055. var value = item.GetValue(
056.
057. searchParameters,
058.
059. BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public,
060.
061. null,
062.
063. null,
064.
065. CultureInfo.InvariantCulture);
066.
067.
068.
069. // Makes sure the property is not the default value.
070.
071. // ! Cannot execute Equals(value, default((Type)variable)) - this does not compile! Using null converts this to 0 for value-types, so it works.
072.
073. if (!Equals(value, null))
074.
075.
076.
077.
078.
079. {
080.
081. parameters.Add(new KeyValuePair<string, object>(
082.
083. item.Name,
084.
085. value));
086.
087. }
088.
089. }
090.
091. }
092.
093. catch
094.
095. {
096.
097. // Not sure what would happen here.
098.
099. continue;
100.
101. }
102.
103. }
104.
105.
106.
107. var paramString = new StringBuilder();
108.
109. var paramValues = new ArrayList();
110.
111. for (var i = 0; i < parameters.Count; i++)
112.
113. {
114.
115. if (i > 0)
116.
117. {
118.
119. paramString.Append(" and ");
120.
121. }
122.
123.
124.
125. paramString.Append(parameters[i].Key);
126.
127. paramString.Append(" = @");
128.
129. paramString.Append(i.ToString());
130.
131.
132.
133. paramValues.Add(parameters[i].Value);
134.
135. }
136.
137.
138.
139. try
140.
141. {
142.
143. var results = this._openAccessContext.GetAll<T>().Where(
144.
145. paramString.ToString(),
146.
147. paramValues.ToArray());
148.
149.
150.
151. return results.ToList();
152.
153. }
154.
155. catch (OpenAccessException ex)
156.
157. {
158.
159. this._openAccessContext.ClearChanges();
160.
161. throw ex;
162.
163. }
164.
165.}
with this one:
001.public List<T> SearchEntities<T>(T searchParameters)
002.
003.{
004.
005. var parameters = new List<KeyValuePair<string, object>>();
006.
007.
008.
009. string typeName = typeof(T).Name;
010.
011. Telerik.OpenAccess.Metadata.MetaPersistentType type =
012.
013. this._openAccessContext.Metadata.PersistentTypes.FirstOrDefault(
014.
015. t => t.Name.Equals(typeName));
016.
017.
018.
019. if (type == null || searchParameters == null)
020.
021. {
022.
023. return new List<T>();
024.
025. }
026.
027.
028.
029. foreach (var item in typeof(T).GetProperties(
030.
031. BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public))
032.
033. {
034.
035. try
036.
037. {
038.
039. Telerik.OpenAccess.Metadata.MetaMember member =
040.
041. type.Members.FirstOrDefault(p =>
042.
043. p.PropertyName != null &&
044.
045. p.PropertyName.Equals(item.Name));
046.
047. bool isMetaPrimitiveMember = member is Telerik.OpenAccess.Metadata.MetaPrimitiveMember;
048.
049.
050.
051. if (isMetaPrimitiveMember)
052.
053. {
054.
055. var value = item.GetValue(
056.
057. searchParameters,
058.
059. BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public,
060.
061. null,
062.
063. null,
064.
065. CultureInfo.InvariantCulture);
066.
067.
068.
069. object defaultValue =
070.
071. item.PropertyType.IsValueType ?
072.
073. Activator.CreateInstance(item.PropertyType) :
074.
075. null;
076.
077. if (!Equals(value, defaultValue))
078.
079. {
080.
081. parameters.Add(new KeyValuePair<string, object>(
082.
083. item.Name,
084.
085. value));
086.
087. }
088.
089. }
090.
091. }
092.
093. catch
094.
095. {
096.
097. // Not sure what would happen here.
098.
099. continue;
100.
101. }
102.
103. }
104.
105.
106.
107. var paramString = new StringBuilder();
108.
109. var paramValues = new ArrayList();
110.
111. for (var i = 0; i < parameters.Count; i++)
112.
113. {
114.
115. if (i > 0)
116.
117. {
118.
119. paramString.Append(" and ");
120.
121. }
122.
123.
124.
125. paramString.Append(parameters[i].Key);
126.
127. paramString.Append(" = @");
128.
129. paramString.Append(i.ToString());
130.
131.
132.
133. paramValues.Add(parameters[i].Value);
134.
135. }
136.
137.
138.
139. try
140.
141. {
142.
143. var results = this._openAccessContext.GetAll<T>().Where(
144.
145. paramString.ToString(),
146.
147. paramValues.ToArray());
148.
149.
150.
151. return results.ToList();
152.
153. }
154.
155. catch (OpenAccessException ex)
156.
157. {
158.
159. this._openAccessContext.ClearChanges();
160.
161. throw ex;
162.
163. }
164.
165.}
Second, you should ensure that all tables
have a primary key defined and all entities have a property which is an identity.
The fix about this problem will be provided in the upcoming service pack of Telerik OpenAccess ORM. We are very sorry for the troubles caused. If you need further assistance we will be more than happy to assist you.
Kind regards,
A.Alexandrov
the Telerik team
Thank you for being the most amazing .NET community! Your unfailing support is what helps us charge forward!
We'd appreciate your vote for Telerik in this year's SQL Server Community Awards. We are competing in TWO categories and every vote counts! VOTE for Telerik NOW >>