As I said in my comment (handles routines such as Type.Name, but not several fields) I allowed a fun multi-user version;)
public static class DynamicLinkExtensions { public static IEnumerable<dynamic> Select<T>(this IQueryable<T> source, string memberAccess) { var propNames = memberAccess.Split('.'); var type = typeof(T); var props = new List<PropertyInfo>(); foreach (var propName in propNames) { var prop = type.GetProperty(propName); props.Add(prop); type = prop.PropertyType; } return source.Select(props.ToArray()); } public static IEnumerable<dynamic> Select<T>(this IQueryable<T> source, PropertyInfo[] props) { var parameter = Expression.Parameter(typeof(T)); var member = Expression.MakeMemberAccess(parameter, (MemberInfo)props.First()); for (var i = 1; i < props.Length; i++) { member = Expression.MakeMemberAccess(member, (MemberInfo)props[i]); } Expression<Func<T, object>> expression = Expression.Lambda<Func<T, object>>(member, new[] { parameter }); return source.Select(expression); } }
Using:
var names = DataContext.Customers.Select("Name").Cast<string>().ToList();
Guillaume86
source share