Generic method to query in Ado.net Entity Framework
Here I am going to talk about the generic method and expression to query using Ado.net Entity Framework. I know it’s not a big deal but I choose simple thing to share my very little knowledge (!!) about expression and entity framework.Ok, here I consider an example of querying Max value. I know it’s already in there but it’s only an approach- of how you use your own (custom) expression when you are in generic place and you don’t know much (properties) about your entity set:
public static int GetMaxValue < T > (ObjectContext contex, string keyFieldName) { if (null != contex) { try{ // First we define the parameter that we are going to use the clause. var param = Expression.Parameter(typeof(T), typeof(T).Name); // Now we’ll make our lambda function that returns the "ID" property . var maxExpression = Expression.Lambda< Func < T ,int > >(Expression.Property(param, keyFieldName), param); // Now I can get desire entityset from context using reflection. System.Data.Objects.ObjectQuery < T > query = contex.GetType().GetProperties().Where(p => p.PropertyType.BaseType.Equals(typeof(System.Data.Objects.ObjectQuery)) && p.PropertyType.GetGenericArguments().First().Equals(typeof(T))).First().GetValue(contex, null) asSystem.Data.Objects.ObjectQuery < T > ; if (null != query) { int? i = query.Max < T , int >(maxExpression); if (i.HasValue) return i.Value; } } catch (Exception){} } return 0; }
You can create your own expression in place of “maxExpression” . Now how do you call this generic method from generic place.lets consider that you want to get the Max of entity-key(Primary key) of an entity-set(Table) and set the (Max + 1) in your new entity object that is going to be added in database.Using reflection you can get the property name/names of Entity key
IEnumerable<PropertyInfo> keyProperties = entity.GetType().GetProperties(). Where(p => ((EdmScalarPropertyAttribute[])p.GetCustomAttributes(typeof(EdmScalarPropertyAttribute), false)).Any(a => a.EntityKeyProperty == true));
If you have composite primary key then value of “keyProperties” will be greater than one. For making our example very simple I assume that here is no composite key here and the datatype of entity key is integer.
PropertyInfo item = keyProperties[0]; //type generic method Type typeofClass = typeof(ClassOfGenericMethod); //take the specific static method MethodInfo methodInfo = typeofClass.GetMethod("GetMaxValue", BindingFlags.Public); // Binding the method info to generic arguments Type[] genericArguments = new Type[] { entity.GetType() }; MethodInfo genericMethodInfo = methodInfo.MakeGenericMethod(genericArguments); // Invoke the method and passing parameters // The null parameter is the object to call the method from.if it is static, pass null. object returnValue = genericMethodInfo.Invoke(null, new object[] { context, item.Name }); //set max value item.SetValue(entity, (long)result + 1, null);
Here I call the “GetMaxValue” and set its value by incease of one to entity-key Property of target object. Anyways Sorry for my bad english.



Hello,
Thanx, for the great article.
How can we get the max value for another integer field other than identity field?
Friendly greetings,
Pieter
Pieter
August 28, 2009
Thank you so much Pieter for your comment and interest. You can see that here I simply use the reflection here to Identify the primary key with help of Custom attribute. But field other than Primary key is not something Unique,You can’t get that using custom attribute. You need something to identify that property. For this You can send the field name as a parameter and Get the Property info Using Reflection. You can also make your custom attribute to identify your desired entity property. All these depend on how have designed your application , Just try to make as much as simple.
morshedanwar
August 31, 2009