给定EF-Code First CTP5实体布局,如:
public class Person { ... }
Run Code Online (Sandbox Code Playgroud)
它有一个集合:
public class Address { ... }
它有一个单一的关联:
public class Mailbox { ... }
我想要做:
PersonQuery.Include(x => x.Addresses).Include("Addresses.Mailbox")
没有使用魔法字符串.我想用lambda表达式来做.
我知道我上面输入的内容将编译并将所有匹配搜索条件的人员带回他们的地址和每个地址的邮箱急切加载,但它是一个令我恼火的字符串.
如果没有字符串我该怎么办?
谢谢堆栈!
这是工作代码;
IQueryable<Product> productQuery = ctx.Set<Product>().Where(p => p.Id == id).(Include"Contexts.AdditionalProperties.Field");
Run Code Online (Sandbox Code Playgroud)
但是你知道如果我们在"Contexts.AdditionalProperties.Field"中的字符串语句中出错,它就不会产生编译时错误
我想写下面的代码;
IQueryable<Product> productQuery = ctx.Set<Product>().Where(p => p.Id == id).Include(p => p.Contexts);
Run Code Online (Sandbox Code Playgroud)
但上面的声明无法给出定义AdditionalProperties和Field的机会.
我们应该做什么?
我想编写多个包含用于构建查询的包含.
谢谢.
我的EF模型的一部分看起来像这样:

摘要:
现在,我正试图实现的查询:
获取有关位置ID 1234的信息,包括与这些讨论相关的任何讨论和评论.
我可以得到讨论和这样的评论:
var discussions = ctx.Posts
.OfType<Discussion>()
.Include(x => x.Comments)
.ToList();
Run Code Online (Sandbox Code Playgroud)
但我似乎无法根据位置实体上的帖子导航获取它.
我试过这个:
var locationWithDiscussionsAndComments = ctx
.Locations
.Include(x => x.Posts
.OfType<Discussion>()
.Select(y => y.Comments))
.SingleOrDefault();
Run Code Online (Sandbox Code Playgroud)
哪个编译,但我得到错误:
System.ArgumentException:包含路径表达式必须引用实体定义的属性,也可以引用嵌套属性或对Select的调用.参数名称:路径
有任何想法吗?我可能会从帖子中"倒退":
var locationWithDiscussionsAndComments = ctx
.Posts
.Include(x => x.Location)
.OfType<Discussion>()
.Include(x => x.Comments)
.Where(x => x.LocationId == 1234)
.Select(x => x.Location)
.ToList();
Run Code Online (Sandbox Code Playgroud)
但就我的存储库而言,这在毛发和语义上都是错误的(我不应该通过帖子库来获取有关位置的信息).
有任何想法吗?
编辑
因此,在对它进行更大的思考之后,我意识到这OfType<T>是一个过滤操作.据我们所知,EF不支持使用预先加载进行过滤.唯一的选择是检索所有内容,或使用匿名类型投影.
我无法检索所有内容,因为涉及的元数据太多了.所以我正在尝试匿名类型投影.
c# abstract-class eager-loading navigational-properties entity-framework-ctp5