簡體   English   中英

如何進行動態LINQ查詢?

[英]How to make a dynamic LINQ query?

有兩個表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;
}

我檢查SQL Server 2014 Profiler中觸發了什么查詢。 如果我在請求中使用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();
}

您可以使用Expression-> LINQ to Entities:Combining Predices

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM