In the non-default switch cases, you return q1 and q2, respectively. These queries are never assigned with anything that involves q, which explains why the Ax conditions aren't present in the final query.
Also, consider the row:
q.Join(q1, x => x.Id, xx => xx.Id, (x, xx) => x);
As with all LINQ methods, the Join method() will not affect q or q1 in any way, but instead return a new IQueryable. The code as written ignores this return value, so the line will have no effect on the final query.
You have the correct pattern everywhere else, that is: "q = q.Something....".
You will have to change the Join() to return new {x, xx} in its last parameter, so that you can move the .Where() call from q1 to q, and still have access to the item from q1. Something like:
var qJoined = q.Join(SessionInstance.Query<Employee1>(),
x => x.Id, xx => xx.Id,
(x, xx) => new {x, xx});
if (!String.IsNullOrEmpty(dto.Unit)) // B1 Condition
qJoined = qJoined.Where(w => w.xx.Unit == dto.Unit);
return qJoined.Select(w => w.x).ToList();