Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何进行动态LINQ查询?_C#_Entity Framework_Linq_Entity Framework 6 - Fatal编程技术网

C# 如何进行动态LINQ查询?

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

有两个表User和Role。我必须在实体框架中获取与请求相关的数据。这是我的要求类

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;
    }