EF代码优先 – 包含(x => x.Properties.Entity)1:多关联

给定EF-Code First CTP5实体布局,如下所示:

public class Person { ... } 

其中有一个集合:

public class Address { ... }

它有一个单一的关联:

public class Mailbox { ... }

我想要做:

PersonQuery.Include(x => x.Addresses).Include("Addresses.Mailbox")

没有使用魔术string。 我想用lambdaexpression式来做。

我知道我上面input的内容将会被编译,并将带回与search条件匹配的所有人员的地址和每个地址的邮箱急切加载,但它是在一个string,激怒了我。

我怎么没有string呢?

感谢堆栈!

为此,您可以使用Select方法:

 PersonQuery.Include(x => x.Addresses.Select(a => a.Mailbox)); 

你可以在这里这里find其他的例子。

对于那些仍然在寻找解决scheme的人来说,Lambda包含的是EF 4+的一部分,它在System.Data.Entity命名空间中; 这里的例子

http://romiller.com/2010/07/14/ef-ctp4-tips-tricks-include-with-lambda/

这是在这篇文章中描述: http : //www.thomaslevesque.com/2010/10/03/entity-framework-using-include-with-lambda-expressions/

编辑(由提问者为了可读性):您正在寻找的部分是:

 public static class ObjectQueryExtensions { 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); } class PropertyPathVisitor : ExpressionVisitor { private Stack<string> _stack; 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(); } protected override Expression VisitMember(MemberExpression expression) { if (_stack != null) _stack.Push(expression.Member.Name); return base.VisitMember(expression); } 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); } private static bool IsLinqOperator(MethodInfo method) { if (method.DeclaringType != typeof(Queryable) && method.DeclaringType != typeof(Enumerable)) return false; return Attribute.GetCustomAttribute(method, typeof(ExtensionAttribute)) != null; } } }