Linq查询自定义Join的条件在哪里?

时间:2017-06-23 10:59:29

标签: entity-framework linq

我有3张桌子 用户, 角色, 系

用户表具有Id,Name,IsDisable,Role_Id,Department_Id

角色表具有Id,Name,IsDisable

部门表有Id,Name,IsDisable

我将根据请求加入表格,仅在请求中我将知道我应该加入哪个表格。所以我正在加入表动态并获取价值。 但现在我必须搜索自由文本。现在我必须在连接表“名称”列中找到包含一些文本的列,例如:('%G%')。如何实现?

IQueryable<User> query=  _odb.User.Where(a=>!a.IsDisable);

if(request.RoleNeeded)
{
    query=from qu in query
    join ro in _odb.Role on us.Role_Id equals Role.Id
    select qu
}

if(request.DepartmentNeeded)
{
    query=from qu in query
    join de in _odb.Department on us.Department_Id equals Department.Id
    select qu
}

如何使用'或'条件动态做'喜欢'的Where条件?

2 个答案:

答案 0 :(得分:0)

尝试代码

在Linq查询和Inside To Where案例中添加左连接。

PendingIntent.getBroadcast()

答案 1 :(得分:0)

如果这可能最终会转到SQL(Linq2SQL,EF等),那么它可以通过一些有意识的选择性代码来最小化潜在的SQL。这需要设置映射,以便数据对象之间的关系是众所周知。 (假设EF或Linq2SQL)

var matchingUsers = _odb.User.Where(u=> false == u.IsDisable && u.Name.Contains("G"));
var matchingRoles = _odb.User.Where(u=> false == u.IsDisable && u.Roles.Any(r=> r.Name.Contains("G"));
var matchingDepartments = _odb.User.Where(u=> false == u.IsDisable && u.Departments.Any(r=> r.Name.Contains("G"));

// The above queries will not have executed yet until we call a ToList, FirstOrDefault, etc.

// Set up which results we are interested in by unioning based on the request.
var query = matchingUsers;
if (request.RoleNeeded)
  query = query.Union(matchingRoles);
if (request.DepartmentNeeded)
  query = query.Union(matchingDepartments);

//Executes and returns our requested matches.
return query.ToList();

应该可以替代地计算单个where子句,但最终会涉及将null条件发送到DB,从而导致更复杂的执行计划。