![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/// <summary> /// 扩展了DbQuery的Include方法 /// </summary> /// <typeparam name="T">进行关联的对象类型</typeparam> /// <param name="query">扩展的ObjectQuery:T</param> /// <param name="selector">指定关联对象属性的Linq表达式</param> /// <returns></returns> public static ObjectQuery<T> Include<T>(this ObjectQuery<T> query, Expression<Func<T, object>> selector) { string path = new PropertyPathVisitor().GetPropertyPath(selector); return query.Include(path); } /// <summary> /// 扩展了DbQuery的Include方法 /// </summary> /// <typeparam name="T">进行关联的对象类型</typeparam> /// <param name="query">扩展的DbQuery:T</param> /// <param name="selector">指定关联对象属性的Linq表达式</param> /// <returns></returns> public static DbQuery<T> Include<T>(this DbQuery<T> query, Expression<Func<T, object>> selector) { string path = new PropertyPathVisitor().GetPropertyPath(selector); return query.Include(path); }
用于获取属性名称的linq表达式树
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/// <summary> /// 属性名称的linq表达式树 /// </summary> class PropertyPathVisitor : ExpressionVisitor { private Stack<string> _stack; /// <summary> /// 通过指定的Linq表达式获取属性名称 /// </summary> /// <param name="expression">指定的属性名称</param> /// <returns></returns> public string GetPropertyPath(Expression expression) { _stack = new Stack<string>(); Visit(expression); return _stack.Aggregate(new StringBuilder(), (sb, name) => (sb.Length > 0 ? sb.Append(".") : sb).Append(name)).ToString(); } /// <summary> /// /// </summary> /// <param name="expression"></param> /// <returns></returns> protected override Expression VisitMember(MemberExpression expression) { if (_stack != null) _stack.Push(expression.Member.Name); return base.VisitMember(expression); } /// <summary> /// /// </summary> /// <param name="expression"></param> /// <returns></returns> protected override Expression VisitMethodCall(MethodCallExpression expression) { if (IsLinqOperator(expression.Method)) { for (int i = 1; i < expression.Arguments.Count; i++) { Visit(expression.Arguments[i]); } Visit(expression.Arguments[0]); return expression; } return base.VisitMethodCall(expression); } /// <summary> /// 判断指定的方法是否是可以执行Linq操作符 /// </summary> /// <param name="method">发现方法的属性并提供对方法元数据的访问。</param> /// <returns></returns> private static bool IsLinqOperator(MethodInfo method) { if (method.DeclaringType != typeof(Queryable) && method.DeclaringType != typeof(Enumerable)) return false; return Attribute.GetCustomAttribute(method, typeof(ExtensionAttribute)) != null; } }
使用方法:
var lsit = db.ProjectPersonRels.Include(p => p.PersonInfo).Where(p => p.ProjectID == projectId).ToList();