复杂查询
当简单的 WhereEq / WhereIn 不够用时,可以把条件组合、子查询和原始 SQL 片段组合起来。
组合条件
csharp
var filter = SqlBuilder<Country>.Filter;
var firstId = 1;
var lastId = 2;
var results = await Db.Query<Country>()
.WhereOr(filter.Eq(i => i.Id, firstId), filter.Eq(i => i.Id, lastId))
.OrderBy(i => i.Id)
.GetListAsync();WhereOr 适合把多个条件组合成一组 OR 分支。对于“满足任意一个条件就返回”的场景,这比手写原始 SQL 更容易维护。
使用子查询
csharp
var userId = 1;
var userRoles = Db.Query<UserRole>()
.WhereEq(i => i.UserId, userId);
var users = await Db.Query<User>()
.WhereExists(userRoles)
.GetListAsync();WhereExists 和 WhereNotExists 都支持把另一个查询直接作为子查询使用。最新代码里也支持把 SqlQueryBuilder 本身传进去,所以你不用先拼字符串。
原始 SQL 兜底
csharp
var results = await Db.Query<User>()
.WhereRaw("[age] >= {0}", 18)
.GetListAsync();如果当前 DSL 还表达不了你的条件,可以用 WhereRaw 兜底。它会继续走参数化绑定,不需要手写字符串拼接。
作为来源的子查询
csharp
var recentRoles = Db.Query<Role>()
.WhereRaw("[created_at] >= {0}", DateTime.UtcNow.AddDays(-7));
var recentRoleRows = await Db.Query<Role>()
.From(recentRoles, "recent_roles")
.GetListAsync();当你需要把一段查询作为新的来源时,可以使用 From(subQuery, alias)。这在报表、统计和临时派生表场景里比较常见。