[英]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.