C# 如何进行动态LINQ查询?
有两个表User和Role。我必须在实体框架中获取与请求相关的数据。这是我的要求类C# 如何进行动态LINQ查询?,c#,entity-framework,linq,entity-framework-6,C#,Entity Framework,Linq,Entity Framework 6,有两个表User和Role。我必须在实体框架中获取与请求相关的数据。这是我的要求类 public class UserRequestDTO { public Int64? RoleId {get;set;} public Int64? DepartmentId {get;set;} } 这是我的数据访问层 public IList<User> GetUser(UserRequestDTO _oUserRequestDTO) { ///This Impleme
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;
}
public IList GetUser(UserRequestDTO\u UserRequestDTO)
{
///这实现了DbContext
DataContext _odb=新的DataContext();
IQueryable查询=_odb.user.where(a=>a.IsDisable.equals(false));
if(_ouserequestdto.RoleId.HasValue)
{
query=来自查询中的qu
来自_odb.role.where(a=>a.Id.equals(qu.RoleId))中的角色
其中role.Id.equals(RoleId)和&role.IsDisable.equals(false))
选择曲;
}
if(_userequestdto.DepartmentId.HasValue)
{
query=来自查询中的qu
来自_odb.role.where(a=>a.Id.equals(qu.RoleId))中的角色
其中role.Department.Id.equals(DepartmentId)和&role.IsDisable.equals(false))
选择曲;
}
IList UserLst=query.ToList();
返回UserLst;
}
我检查SQL Server 2014探查器中触发的查询。如果在请求中使用RoleId或DepartmentId进行筛选,则查询中不会出现问题。但如果我同时使用RoleId和DepartmentId进行过滤。在探查器中,我看到两个内部连接在一起
如何使其成为单个内部联接
有没有办法了解如何通过Linq生成查询?在一个变量中选择查询的公共部分:
public IList<User> GetUser(UserRequestDTO _oUserRequestDTO)
{
DataContext _odb = new DataContext();
var users =_odb.user.where(a=>a.IsDisable.equals(false));
var query = from qu in users
from role in _odb.Role.where(a=>a.Id.equals(qu.RoleId))
select new { User = qu, Role = role };
if(_oUserRequestDTO.RoleId.HasValue)
{
query = from o in query
where o.Role.Id.equals(RoleId) && o.Role.IsDisable.equals(false))
select o;
}
if(_oUserRequestDTO.DepartmentId.HasValue)
{
query = from o in query
where o.Role.Department.Id.equals(DepartmentId) && o.Role.IsDisable.equals(false))
select o;
}
return query.Select(o => o.User).ToList();
}
public IList GetUser(UserRequestDTO\u UserRequestDTO)
{
DataContext _odb=新的DataContext();
var users=_odb.user.where(a=>a.IsDisable.equals(false));
var query=来自用户中的qu
来自_odb.role.where(a=>a.Id.equals(qu.RoleId))中的角色
选择新建{User=qu,Role=Role};
if(_ouserequestdto.RoleId.HasValue)
{
查询=从查询中的o开始
其中o.Role.Id.equals(RoleId)和&o.Role.IsDisable.equals(false))
选择o;
}
if(_userequestdto.DepartmentId.HasValue)
{
查询=从查询中的o开始
其中o.Role.Department.Id.equals(部门Id)和o.Role.IsDisable.equals(false))
选择o;
}
返回query.Select(o=>o.User.ToList();
}
您可以使用表达式-->
public IList GetUser(UserRequestDTO\u UserRequestDTO)
{
///这实现了DbContext
DataContext _odb=新的DataContext();
表达式expresionWhere=a=>a.IsDisable.equals(false);
if(_ouserequestdto.RoleId.HasValue)
{
表达式expresionRoleId=UserRequestDTO.RoleId=RoleId&&!Role.IsDisable);
expresionWhere=PredicateBuilder.And(expresionWhere,expresionRoleId);
}
if(_userequestdto.DepartmentId.HasValue)
{
表达式expresionDepartmentId=UserRequestDTO.DepartmentId=DepartmentId&&!Role.IsDisable);
expresionWhere=PredicateBuilder.And(expresionWhere,expresionDepartmentId);
}
IList UserLst=odb.user.Include(“UserRequestDTO”).Where(expresionWhere.toList();
返回UserLst;
}
为什么会有两个内部连接?实体框架查询是“延迟”查询。在你开始询问结果之前,他们实际上不会运行。根据您的代码,查询将在IList UserLst=query.ToList()处触发代码>您希望获得什么样的结果?并向我们展示您在探查器中看到的sql。向我们展示您的实体类(角色和用户)及其EF映射。嗨,Krill,我很抱歉这个问题,您想让我编辑我的问题吗?嗨,vantian,我遇到了这个问题,有没有办法解决它。请让我知道。是否有用户角色导航属性?如果没有,您应该创建它。您好,我不能写这个查询,因为在我的用户类中,我没有角色对象,我只有角色IDcolumn@GopinathNavannethan我没有从User
类获得Role
。看看我的查询,我创建了一个新类new{User=qu,Role=Role}
Hi Backs,谢谢让我试试这个:-)谢谢让我试试这个:-)
public IList<User> GetUser(UserRequestDTO _oUserRequestDTO)
{
///This Implements the DbContext
DataContext _odb=new DataContext();
Expression<Func<User, bool>> expresionWhere =a=>a.IsDisable.equals(false);
if(_oUserRequestDTO.RoleId.HasValue)
{
Expression<Func<User, bool>> expresionRoleId = UserRequestDTO.RoleId =RoleId && !Role.IsDisable);
expresionWhere= PredicateBuilder.And(expresionWhere, expresionRoleId );
}
if(_oUserRequestDTO.DepartmentId.HasValue)
{
Expression<Func<User, bool>> expresionDepartmentId = UserRequestDTO.DepartmentId=DepartmentId && !Role.IsDisable);
expresionWhere= PredicateBuilder.And(expresionWhere, expresionDepartmentId );
}
IList<User> UserLst=odb.user.Include("UserRequestDTO").Where(expresionWhere).toList();
return UserLst;
}