mcpField
S
syncfusion-blazor-query-builder

syncfusion-blazor-query-builder

github.com/syncfusion开发4369 次安装1 周前更新
代码仓库

关于 syncfusion-blazor-query-builder

面向开发者的 Syncfusion Blazor Query Builder 参考资料,可通过规则和嵌套分组构建数据筛选条件,涵盖查询编辑、数据绑定、自定义及查询格式导入导出。

主要功能

  1. 01规则与嵌套 AND/OR 分组
  2. 02以代码管理规则和分组
  3. 03拖放编辑查询
  4. 04查询状态持久化
  5. 05导出 SQL 和 MongoDB 查询
  6. 06本地化与无障碍支持

适用场景

  1. 01构建高级搜索界面
  2. 02将用户定义的条件应用于数据集
  3. 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.md
basic-setup.md
customization-and-styling.md
data-binding.md
events-and-callbacks.md
filtering-and-rules.md
getting-started.md
localization-and-accessibility.md
troubleshooting.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
自定义模板品牌化 UIcustomization-and-styling.md

后续步骤

  1. 从 references/getting-started.md 开始,设置环境
  2. 按照 references/basic-setup.md 配置组件
  3. 查看 references/filtering-and-rules.md,了解核心筛选逻辑
  4. 使用 references/events-and-callbacks.md 处理查询
  5. 根据需要参考其他指南,了解高级场景

评论

支持 Markdown