Skip to content

复杂查询

当简单的 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();

WhereExistsWhereNotExists 都支持把另一个查询直接作为子查询使用。最新代码里也支持把 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)。这在报表、统计和临时派生表场景里比较常见。