关于 syncfusion-blazor-query-builder
面向开发者的 Syncfusion Blazor Query Builder 参考资料,可通过规则和嵌套分组构建数据筛选条件,涵盖查询编辑、数据绑定、自定义及查询格式导入导出。
主要功能
- 01规则与嵌套 AND/OR 分组
- 02以代码管理规则和分组
- 03拖放编辑查询
- 04查询状态持久化
- 05导出 SQL 和 MongoDB 查询
- 06本地化与无障碍支持
适用场景
- 01构建高级搜索界面
- 02将用户定义的条件应用于数据集
- 03导出查询规则供数据库使用
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ syncfusion/ blazor-ui-components-skills --skill syncfusion-blazor-query-builder安装后在 Claude Code 中输入/syncfusion-blazor-query-builder确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/advanced-features.mdbasic-setup.mdcustomization-and-styling.mddata-binding.mdevents-and-callbacks.mdfiltering-and-rules.mdgetting-started.mdlocalization-and-accessibility.mdtroubleshooting.md详细介绍
实现 Syncfusion Blazor Query Builder
Syncfusion Blazor Query Builder 组件支持构建动态、可自定义的查询界面,以便通过复杂条件、嵌套组和基于规则的逻辑筛选数据。它非常适合高级搜索 UI、业务规则引擎和数据筛选工作流。
组件概览
Query Builder 将筛选逻辑组织为:
- 规则: 单个条件(字段 = 值)
- 组: 按 AND/OR 逻辑组合的规则集合
- 运算符: 比较类型(等于、包含、介于等)
- 列: 可用于筛选的数据源字段
主要功能包括以编程方式管理规则和组、事件处理、拖放 UI、状态持久化以及丰富的自定义选项。
导航指南
快速入门
📄 阅读: references/getting-started.md
- Blazor WebAssembly 和 Blazor Server 的安装与设置
- NuGet 包配置
- 初始项目设置
- 运行第一个 Query Builder
基本设置与配置
📄 阅读: references/basic-setup.md
- 创建 Query Builder 组件
- 定义列和数据类型
- 配置按钮可见性
- 设置默认规则和初始状态
筛选、规则与组(核心功能)
📄 阅读: references/filtering-and-rules.md
- 以编程方式添加和删除规则
- 创建和管理组
- 运算符和条件
- 复杂的嵌套组模式
- 用户交互和验证
数据绑定与筛选结果
📄 阅读: references/data-binding.md
- 将数据源绑定到 Query Builder
- 提取和处理筛选后的记录
- 动态数据加载模式
- 将查询应用于数据集
事件与回调(核心功能)
📄 阅读: references/events-and-callbacks.md
- 组件生命周期事件(Created、Destroyed)
- 规则变更跟踪(RuleChanged、Changed)
- 变更前验证(OnValueChange)
- 事件驱动的查询更新
自定义与样式
📄 阅读: references/customization-and-styling.md
- CSS 自定义与主题设置
- 自定义 UI 的模板支持
- 自定义运算符定义
- 组和规则的视觉样式
高级功能
📄 阅读: references/advanced-features.md
- 导入/导出查询(JSON、URL 参数)
- 状态持久化和本地存储
- 拖放规则和组管理
- 锁定/克隆组规则
- 只读模式
- 查询排序和筛选
本地化与无障碍功能
📄 阅读: references/localization-and-accessibility.md
- 多语言支持(本地化)
- 从右到左(RTL)支持
- 无障碍最佳实践
- 键盘导航
- 屏幕阅读器支持
故障排除
📄 阅读: references/troubleshooting.md
- 常见配置问题
- 事件处理问题
- 数据绑定故障排除
- 性能优化
- 测试策略
快速开始
下面是一个用于快速入门的简短示例:
@using Syncfusion.Blazor.QueryBuilder
<SfQueryBuilder TValue="Order" DataSource="@Orders">
<QueryBuilderColumns>
<QueryBuilderColumn Field="OrderID" Label="Order ID" Type="ColumnType.Number"></QueryBuilderColumn>
<QueryBuilderColumn Field="CustomerName" Label="Customer" Type="ColumnType.String"></QueryBuilderColumn>
<QueryBuilderColumn Field="OrderDate" Label="Date" Type="ColumnType.Date"></QueryBuilderColumn>
</QueryBuilderColumns>
</SfQueryBuilder>
@code {
private List<Order> Orders { get; set; } = new()
{
new() { OrderID = 1, CustomerName = "Acme Corp", OrderDate = new(2024, 1, 15) },
new() { OrderID = 2, CustomerName = "Tech Ltd", OrderDate = new(2024, 2, 20) }
};
public class Order {
public int OrderID { get; set; }
public string CustomerName { get; set; }
public DateTime OrderDate { get; set; }
}
}
常见模式
以编程方式添加规则
<SfButton OnClick="AddFilterRule">Add Rule</SfButton>
@code {
private SfQueryBuilder<Order> QueryBuilder;
private async Task AddFilterRule() {
var rule = new RuleModel {
Label = "Order ID",
Field = "OrderID",
Type = "Number",
Operator = "equal",
Value = 1000
};
await QueryBuilder.AddRule(rule, "group0");
}
}
捕获查询变更
<SfQueryBuilder TValue="Order" DataSource="@Orders">
<QueryBuilderEvents TValue="Order" RuleChanged="OnRuleChanged"></QueryBuilderEvents>
</SfQueryBuilder>
@code {
private void OnRuleChanged(RuleChangeEventArgs args) {
Console.WriteLine($"Query changed: {args.RuleID}");
// Apply new filter or update results
}
}
将查询导出为 JSON
<SfButton OnClick="ExportQuery">Export</SfButton>
@code {
private SfQueryBuilder<Order> QueryBuilder;
private async Task ExportQuery() {
var queryJson = QueryBuilder.GetRules();
// Save or transmit queryJson
}
}
克隆规则或组
<SfQueryBuilder TValue="Order" @ref="QueryBuilder">
<QueryBuilderShowButtons CloneGroup="true" CloneRule="true"></QueryBuilderShowButtons>
</SfQueryBuilder>
<SfButton OnClick="CloneRule">Clone Rule</SfButton>
<SfButton OnClick="CloneGroup">Clone Group</SfButton>
@code {
private SfQueryBuilder<Order> QueryBuilder;
private void CloneRule() {
// Clone the first rule at position 1
QueryBuilder.CloneRule("group0_rule0", 1);
}
private void CloneGroup() {
// Clone group1 at position 2
QueryBuilder.CloneGroup("group1", 2);
}
}
锁定规则或组
<SfQueryBuilder TValue="Order" @ref="QueryBuilder">
<QueryBuilderShowButtons LockGroup="true" LockRule="true"></QueryBuilderShowButtons>
</SfQueryBuilder>
<SfButton OnClick="LockRule">Lock Rule</SfButton>
<SfButton OnClick="UnlockRule">Unlock Rule</SfButton>
@code {
private SfQueryBuilder<Order> QueryBuilder;
private void LockRule() {
// Lock the rule to prevent editing
QueryBuilder.LockRule("group0_rule0", true);
}
private void UnlockRule() {
// Unlock the rule to allow editing
QueryBuilder.LockRule("group0_rule0", false);
}
}
查询导出方法
Query Builder 提供了用于以不同格式导出查询的内置方法:
1. GetSqlFromRules - 导出为内联 SQL
将查询规则转换为标准 SQL WHERE 子句格式:
<SfQueryBuilder TValue="Order" @ref="QueryBuilder">
<QueryBuilderColumns>
<QueryBuilderColumn Field="OrderID" Label="Order ID" Type="ColumnType.Number"></QueryBuilderColumn>
<QueryBuilderColumn Field="CustomerName" Label="Customer" Type="ColumnType.String"></QueryBuilderColumn>
</QueryBuilderColumns>
</SfQueryBuilder>
<SfButton OnClick="ExportInlineSQL">Get SQL Query</SfButton>
<p>@SqlQuery</p>
@code {
private SfQueryBuilder<Order> QueryBuilder;
private string SqlQuery = "";
private void ExportInlineSQL() {
RuleModel rules = QueryBuilder.GetValidRules();
SqlQuery = QueryBuilder.GetSqlFromRules(rules);
// Output: "OrderID = 1000 AND CustomerName LIKE '%Acme%'"
}
public class Order {
public int OrderID { get; set; }
public string CustomerName { get; set; }
}
}
2. GetParameterSql - 导出为参数化 SQL
导出带索引参数的 SQL,以防止 SQL 注入:
@using System.Text.Json
<SfButton OnClick="ExportParameterSQL">Get Parameterized SQL</SfButton>
<pre>@ParameterSqlJson</pre>
@code {
private SfQueryBuilder<Order> QueryBuilder;
private string ParameterSqlJson = "";
private void ExportParameterSQL() {
RuleModel rules = QueryBuilder.GetValidRules();
ParameterSql paramSql = QueryBuilder.GetParameterSql(rules);
ParameterSqlJson = JsonSerializer.Serialize(paramSql, new JsonSerializerOptions {
WriteIndented = true,
Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping
});
// Access individual properties:
// paramSql.Sql - SQL string with ? placeholders
// paramSql.Parameters - List of parameter values
}
}
输出示例:
{
"Sql": "OrderID = ? AND CustomerName LIKE ?",
"Parameters": [1000, "%Acme%"]
}
3. GetNamedParameterSql - 导出为命名参数 SQL
导出包含命名参数(@param0、@param1 等)的 SQL:
@using System.Text.Json
<SfButton OnClick="ExportNamedParameterSQL">Get Named Parameter SQL</SfButton>
<pre>@NamedParameterSqlJson</pre>
@code {
private SfQueryBuilder<Order> QueryBuilder;
private string NamedParameterSqlJson = "";
private void ExportNamedParameterSQL() {
RuleModel rules = QueryBuilder.GetValidRules();
NamedParameterSql namedParamSql = QueryBuilder.GetNamedParameterSql(rules);
NamedParameterSqlJson = JsonSerializer.Serialize(namedParamSql, new JsonSerializerOptions {
WriteIndented = true,
Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping
});
// Access individual properties:
// namedParamSql.Sql - SQL string with @param placeholders
// namedParamSql.Parameters - Dictionary of parameter names/values
}
}
输出示例:
{
"Sql": "OrderID = @param0 AND CustomerName LIKE @param1",
"Parameters": {
"@param0": 1000,
"@param1": "%Acme%"
}
}
4. GetMongoQuery - 导出为 MongoDB 查询
将查询规则转换为 MongoDB 查询格式:
@using System.Text.Json
<SfButton OnClick="ExportMongoQuery">Get MongoDB Query</SfButton>
<pre>@MongoQueryJson</pre>
@code {
private SfQueryBuilder<Order> QueryBuilder;
private string MongoQueryJson = "";
private void ExportMongoQuery() {
RuleModel rules = QueryBuilder.GetValidRules();
string mongoQuery = QueryBuilder.GetMongoQuery(rules);
// Pretty print the JSON
JsonDocument jsonDoc = JsonDocument.Parse(mongoQuery);
MongoQueryJson = JsonSerializer.Serialize(jsonDoc.RootElement, new JsonSerializerOptions {
WriteIndented = true
});
}
}
输出示例:
{
"$and": [
{ "OrderID": { "$eq": 1000 } },
{ "CustomerName": { "$regex": "Acme", "$options": "i" } }
]
}
导入查询的方法
你也可以将查询导入回 Query Builder:
@code {
// Import from SQL
private void ImportSQL(string sqlQuery) {
QueryBuilder.SetRulesFromSql(sqlQuery);
}
// Import from Parameterized SQL
private void ImportParameterSQL(ParameterSql paramSql) {
QueryBuilder.SetParameterSql(paramSql);
}
// Import from Named Parameter SQL
private void ImportNamedParameterSQL(NamedParameterSql namedParamSql) {
QueryBuilder.SetNamedParameterSql(namedParamSql);
}
// Import from MongoDB Query
private void ImportMongoQuery(string mongoQuery) {
QueryBuilder.SetMongoQuery(mongoQuery);
}
}
完整的查询导出/导入示例
@page "/query-export-demo"
@using Syncfusion.Blazor.QueryBuilder
@using Syncfusion.Blazor.Buttons
@using System.Text.Json
<SfQueryBuilder TValue="Order" @ref="QueryBuilder">
<QueryBuilderColumns>
<QueryBuilderColumn Field="OrderID" Label="Order ID" Type="ColumnType.Number"></QueryBuilderColumn>
<QueryBuilderColumn Field="CustomerName" Label="Customer" Type="ColumnType.String"></QueryBuilderColumn>
<QueryBuilderColumn Field="OrderDate" Label="Order Date" Type="ColumnType.Date"></QueryBuilderColumn>
<QueryBuilderColumn Field="Amount" Label="Amount" Type="ColumnType.Number"></QueryBuilderColumn>
</QueryBuilderColumns>
</SfQueryBuilder>
<div class="button-group">
<SfButton OnClick="@(() => ExportQuery("SQL"))">Export SQL</SfButton>
<SfButton OnClick="@(() => ExportQuery("ParameterSQL"))">Export Parameter SQL</SfButton>
<SfButton OnClick="@(() => ExportQuery("NamedSQL"))">Export Named SQL</SfButton>
<SfButton OnClick="@(() => ExportQuery("MongoDB"))">Export MongoDB</SfButton>
</div>
<div class="output">
<h3>@OutputTitle</h3>
<pre>@OutputQuery</pre>
</div>
@code {
private SfQueryBuilder<Order> QueryBuilder;
private string OutputQuery = "";
private string OutputTitle = "";
private void ExportQuery(string format) {
RuleModel rules = QueryBuilder.GetValidRules();
switch(format) {
case "SQL":
OutputTitle = "Inline SQL Query";
OutputQuery = QueryBuilder.GetSqlFromRules(rules);
break;
case "ParameterSQL":
OutputTitle = "Parameterized SQL Query";
ParameterSql paramSql = QueryBuilder.GetParameterSql(rules);
OutputQuery = JsonSerializer.Serialize(paramSql, new JsonSerializerOptions {
WriteIndented = true,
Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping
});
break;
case "NamedSQL":
OutputTitle = "Named Parameter SQL Query";
NamedParameterSql namedSql = QueryBuilder.GetNamedParameterSql(rules);
OutputQuery = JsonSerializer.Serialize(namedSql, new JsonSerializerOptions {
WriteIndented = true,
Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping
});
break;
case "MongoDB":
OutputTitle = "MongoDB Query";
string mongoQuery = QueryBuilder.GetMongoQuery(rules);
JsonDocument jsonDoc = JsonDocument.Parse(mongoQuery);
OutputQuery = JsonSerializer.Serialize(jsonDoc.RootElement, new JsonSerializerOptions {
WriteIndented = true
});
break;
}
}
public class Order {
public int OrderID { get; set; }
public string CustomerName { get; set; }
public DateTime OrderDate { get; set; }
public decimal Amount { get; set; }
}
}
主要功能一览
| 功能 | 用例 | 参考 |
|---|---|---|
| 拖放规则 | 交互式地重新排列条件 | advanced-features.md |
| 克隆组/规则 | 复制复杂的查询结构 | advanced-features.md |
| 锁定组/规则 | 防止编辑特定条件 | advanced-features.md |
| 嵌套组 | 复杂的多条件逻辑 | filtering-and-rules.md |
| 事件跟踪 | 响应查询更改 | events-and-callbacks.md |
| 状态持久化 | 保存/恢复查询 | advanced-features.md |
| 本地化 | 多语言支持 | localization-and-accessibility.md |
| 自定义模板 | 品牌化 UI | customization-and-styling.md |
后续步骤
- 从 references/getting-started.md 开始,设置环境
- 按照 references/basic-setup.md 配置组件
- 查看 references/filtering-and-rules.md,了解核心筛选逻辑
- 使用 references/events-and-callbacks.md 处理查询
- 根据需要参考其他指南,了解高级场景