【发布时间】:2015-12-28 04:33:40
【问题描述】:
有两个表用户和角色。我必须获取与实体框架中的请求相关的数据。这是我的请求类
public class UserRequestDTO
{
public Int64? RoleId {get;set;}
public Int64? DepartmentId {get;set;}
}
这是我的数据访问层
public IList<User> GetUser(UserRequestDTO _oUserRequestDTO)
{
///This Implements the DbContext
DataContext _odb=new DataContext();
IQueryable<User> query=_odb.user.where(a=>a.IsDisable.equals(false));
if(_oUserRequestDTO.RoleId.HasValue)
{
query= from qu in query
from role in _odb.Role.where(a=>a.Id.equals(qu.RoleId))
Where role.Id.equals(RoleId)&& role.IsDisable.equals(false))
Select qu;
}
if(_oUserRequestDTO.DepartmentId.HasValue)
{
query= from qu in query
from role in _odb.Role.where(a=>a.Id.equals(qu.RoleId))
Where role.Department.Id.equals(DepartmentId)&& role.IsDisable.equals(false))
Select qu;
}
IList<User> UserLst=query.ToList();
return UserLst;
}
我检查了 SQL Server 2014 Profiler 中正在触发的查询。如果我在请求中使用 RoleId 或 DepartmentId 进行过滤,则查询中没有问题。但是,如果我同时使用 RoleId 和 DepartmentId 进行过滤。在 Profiler 中,我看到了两个内部连接。
我怎样才能把它变成一个单一的内部连接?
有什么方法可以了解如何通过 Linq 生成查询?
【问题讨论】:
-
为什么会有两个内连接?实体框架查询是“延迟”查询。在您开始询问结果之前,它们实际上不会运行。根据您的代码,查询将在
IList<User> UserLst=query.ToList();触发 -
你想要达到什么样的结果?并向我们展示您在分析器中看到了什么 sql。向我们展示您的实体类(角色和用户)及其 EF 映射。
-
嗨,Krill,我很抱歉这个问题,你想让我编辑我的问题吗?
-
嗨,vantian,我遇到了这个问题,有什么办法可以解决它。请告诉我。
-
没有
User.Roles导航属性吗?如果没有,您应该创建它。
标签: c# entity-framework linq entity-framework-6