我正在asp.net MVC上创建一个网站,我正在使用存储库接口在内存中使用存储库并使用数据库。
我已经修好了所有关系,我的意思是例如当我有一个联系人而不是他有地址时,所以..当我向这个联系人添加一个地址时自动修复address.contact指向联系人的关系,我将实体框架的属性虚拟化,然后使用数据库存储库创建代理。
我的问题从这里开始:
我有一个这样的查询:
return query.Where(c => c.UserID == clientId)
.Include(c => c.AssignedProjects)
.Select(c => new UserDetailsData<Client>
{
User = c,
IssuesCount = c.IssuesReported.Count()
}).Single();
使用include。 如果我删除Select assignedProjects将包含此客户端的Projects,但是当我包含Select AssignedProjects时为null且匿名对象很好但是..用户不包含任何AssignedProjects。
在内存中我可以做到这一点,但使用EF我不能。
我想要的最终图是..具有clientID的用户具有他的项目的集合AssignedProjects并创建匿名对象与User(带有集合)和IssuesCount传递到视图以显示AssignedProjects,用户信息和数字客户报告的问题..
任何人都知道如何解决这个问题?
答案 0 :(得分:0)
就使用Entity Framework生成商店表达式而言,Include(预先加载)不能与Select(投影)一起使用。
您可以找到更多信息If I select from an IQueryable then the Include is lost,同时您也可以看到相关工作。
我不确定列出的工作是否会在你的情况下有效,因为你的投影有多个回报(而不是预期的对象)。
既然您说除了执行实际计数之外您最终的图表是什么,为什么不把它变成:
var user = query.Where(c => c.UserID == clientId)
.Include(c => c.AssignedProjects)
.Include(c => c.IssuesReported)
.Single();
var userDetailsData = new UserDetailsData<Client>()
{
User = user,
IssuesCount = user.IssuesReported.Count(),
};
答案 1 :(得分:0)
你可以试试这个:
return query.Where(c => c.UserID == clientId)
.Select(c => new UserDetailsData<Client>
{
User = c,
AssignedProjects = c.AssignedProjects,
IssuesCount = c.IssuesReported.Count()
}).Single();
虽然您对项目类型的AssignedProjects
属性不感兴趣,但它也会填充User.AssignedProjects
属性。这利用了“关系跨度”,这是EF中的一项功能,可自动构建加载到上下文中的对象的导航属性。
请注意,这实际上依赖于将对象加载到上下文中的事实。如果您停用跟踪功能 - 例如在查询中使用AsNoTracking()
- 它就不再有效了。