My two cents: I have an example of this already:
var qf = new QueryFactory();
var adapter = new DataAccessAdapter();
// inner query
var q1 = qf.Create("q1")
.Select(() => new
{
EmployeeId = EmployeeFields.EmployeeId.ToValue<int>(),
Name = StringFunctions.Concat(EmployeeFields.FirstName, EmployeeFields.LastName).As("FullName").ToValue<string>()
});
// ourter query
var q2 = qf.Create()
.SelectFrom(q1)
.Where(qf.Field(q1.Alias, "FullName").Like("A b%"));
// fetch
var results = adapter.FetchQuery(q2);
Generated SQL:
SELECT "LPA_q1"."EmployeeId",
"LPA_q1"."FullName"
FROM (SELECT "HR"."EMPLOYEES"."EMPLOYEE_ID" AS "EmployeeId",
("HR"."EMPLOYEES"."FIRST_NAME"
|| "HR"."EMPLOYEES"."LAST_NAME") AS "FullName"
FROM "HR"."EMPLOYEES") "LPA_q1"
WHERE (((("LPA_q1"."FullName" LIKE :p1))))