筛选 GraphQL 中的数据 (filter

筛选将大型数据集缩小为仅所需的记录。 在 GraphQL 中,数据 API 生成器(DAB)支持实体查询的结构化 filter 参数。 每个筛选器编译为参数化 SQL,以确保安全性和一致性。

注释

GraphQL 筛选支持比较、逻辑、字符串模式、成员资格和 null 运算符。 GraphQL 筛选器使用结构化输入对象: { fieldName: { operator: value } }. 日期必须是有效的 ISO 8601 UTC 字符串。 Null 检查使用 isNull 而不是 eq null

快速浏览

Operator Meaning
eq 平等
neq 不等于
gt 大于
gte 大于或等于
lt 小于
lte 小于或等于
and 逻辑 AND
or 逻辑 OR
contains 子字符串匹配
notContains 非子字符串匹配
startsWith 前缀匹配
endsWith 后缀匹配
in 成员资格
isNull null 检查

eq

等于。 返回字段的值与提供的文字完全匹配的记录;如果使用,则返回 isNullnull。

注释

筛选日期或日期/时间字段时,请使用 无引号 的 ISO 8601 UTC 格式(yyyy-MM-ddTHH:mm:ssZ)。 带引号或 OData 样式的格式无效。

  • 错误: $filter=Date ge '2025-01-01'
  • 错误: $filter=Date ge datetime'2025-01-01'
  • 正确:$filter=Date ge 2025-01-01T00:00:00Z

在此示例中,我们获取标题所在 'Dune'书籍,可用标志为 true,价格为 20,发布日期为 2024 年 1 月 1 日,评级为 null。

query {
  books(filter: {
    and: [
      { title: { eq: "Dune" } }
      { available: { eq: true } }
      { price: { eq: 20 } }
      { publishedOn: { eq: "2024-01-01T00:00:00Z" } }
      { rating: { isNull: true } }
    ]
  }) {
    items { id title available price publishedOn rating }
  }
}

概念 SQL

SELECT id, title, available, price, publishedOn, rating
FROM Books
WHERE title = 'Dune'
  AND available = 1
  AND price = 20
  AND publishedOn = '2024-01-01T00:00:00Z'
  AND rating IS NULL;

neq

不等于。 返回字段的值与文本不匹配或与文本组合 isNull: false时不为 null 的记录。

在此示例中,我们将获取标题不 'Foundation'为、可用标志不为 false、价格不为零、发布日期不是 2023 年 12 月 31 日且分级不为 null 的书籍。

query {
  books(filter: {
    and: [
      { title: { neq: "Foundation" } }
      { available: { neq: false } }
      { price: { neq: 0 } }
      { publishedOn: { neq: "2023-12-31T00:00:00Z" } }
      { rating: { isNull: false } }
    ]
  }) {
    items { id title available price publishedOn rating }
  }
}

概念 SQL

SELECT id, title, available, price, publishedOn, rating
FROM Books
WHERE title <> 'Foundation'
  AND available <> 0
  AND price <> 0
  AND publishedOn <> '2023-12-31T00:00:00Z'
  AND rating IS NOT NULL;

gt

大于。 返回字段值严格高于提供的文字的记录。

在此示例中,我们获取的书籍标题按字母顺序 'A'排序,可用标志为 true,价格大于 10,发布日期在 2020 年 1 月 1 日之后。

query {
  books(filter: {
    and: [
      { title: { gt: "A" } }
      { available: { gt: false } }
      { price: { gt: 10 } }
      { publishedOn: { gt: "2020-01-01T00:00:00Z" } }
    ]
  }) {
    items { id title available price publishedOn }
  }
}

概念 SQL

SELECT id, title, available, price, publishedOn
FROM Books
WHERE title > 'A'
  AND available > 0
  AND price > 10
  AND publishedOn > '2020-01-01T00:00:00Z';

gte

大于或等于。 返回字段值高于或等于给定文本的记录。

在此示例中,我们获取的书籍标题 'A' 为或更高版本,可用标志为 true,价格至少为 10,发布日期为 2020 年 1 月 1 日或之后。

query {
  books(filter: {
    and: [
      { title: { gte: "A" } }
      { available: { gte: false } }
      { price: { gte: 10 } }
      { publishedOn: { gte: "2020-01-01T00:00:00Z" } }
    ]
  }) {
    items { id title available price publishedOn }
  }
}

概念 SQL

SELECT id, title, available, price, publishedOn
FROM Books
WHERE title >= 'A'
  AND available >= 0
  AND price >= 10
  AND publishedOn >= '2020-01-01T00:00:00Z';

lt

小于。 返回字段值严格低于给定文本的记录。

在此示例中,我们获取其标题排序之前的 'Z'书籍,可用标志为 false,价格小于 50,发布日期在 2030 年 1 月 1 日之前。

query {
  books(filter: {
    and: [
      { title: { lt: "Z" } }
      { available: { lt: true } }
      { price: { lt: 50 } }
      { publishedOn: { lt: "2030-01-01T00:00:00Z" } }
    ]
  }) {
    items { id title available price publishedOn }
  }
}

概念 SQL

SELECT id, title, available, price, publishedOn
FROM Books
WHERE title < 'Z'
  AND available < 1
  AND price < 50
  AND publishedOn < '2030-01-01T00:00:00Z';

lte

小于或等于。 返回字段值小于或等于给定文本的记录。

在此示例中,我们获取的书籍的标题排序之前或等于 'Z',可用标志为 true,价格为 100 或更少,发布日期在 2030 年 1 月 1 日或之前。

query {
  books(filter: {
    and: [
      { title: { lte: "Z" } }
      { available: { lte: true } }
      { price: { lte: 100 } }
      { publishedOn: { lte: "2030-01-01T00:00:00Z" } }
    ]
  }) {
    items { id title available price publishedOn }
  }
}

概念 SQL

SELECT id, title, available, price, publishedOn
FROM Books
WHERE title <= 'Z'
  AND available <= 1
  AND price <= 100
  AND publishedOn <= '2030-01-01T00:00:00Z';

and

逻辑 AND。 合并多个谓词,这些谓词必须全部为 true 才能匹配记录。

在此示例中,我们获取的书籍可用、成本小于 30,并在 2022 年 1 月 1 日之后出版。

query {
  books(filter: {
    and: [
      { available: { eq: true } }
      { price: { lt: 30 } }
      { publishedOn: { gt: "2022-01-01T00:00:00Z" } }
    ]
  }) {
    items { id title available price publishedOn }
  }
}

概念 SQL

SELECT id, title, available, price, publishedOn
FROM Books
WHERE available = 1
  AND price < 30
  AND publishedOn > '2022-01-01T00:00:00Z';

or

逻辑或。 返回数组中至少有一个谓词的计算结果为 true 的记录。

在此示例中,我们获取的书籍要么缺货,要么定价超过 50。

query {
  books(filter: {
    or: [
      { available: { eq: false } }
      { price: { gt: 50 } }
    ]
  }) {
    items { id title available price }
  }
}

概念 SQL

SELECT id, title, available, price
FROM Books
WHERE available = 0
   OR price > 50;

contains

子字符串匹配。 返回字段包含提供的子字符串的记录(区分大小写取决于数据库排序规则)。

在此示例中,我们将获得标题包含“Dune”一词的书籍。

query {
  books(filter: { title: { contains: "Dune" } }) {
    items { id title }
  }
}

概念 SQL

SELECT id, title
FROM Books
WHERE title LIKE '%Dune%';

notContains

负子字符串匹配。 返回字段 不包含 提供的子字符串的记录。

在此示例中,我们将获得其标题不包含“指南”的书籍。

query {
  books(filter: { title: { notContains: "Guide" } }) {
    items { id title }
  }
}

概念 SQL

SELECT id, title
FROM Books
WHERE title NOT LIKE '%Guide%';

startsWith

前缀匹配。 返回字段以提供的字符串开头的记录。

在此示例中,我们获取其标题以“The”开头的书籍。

query {
  books(filter: { title: { startsWith: "The" } }) {
    items { id title }
  }
}

概念 SQL

SELECT id, title
FROM Books
WHERE title LIKE 'The%';

endsWith

后缀匹配。 返回字段以提供的字符串结尾的记录。

在此示例中,我们将获得标题以“Chronicles”结尾的书籍。

query {
  books(filter: { title: { endsWith: "Chronicles" } }) {
    items { id title }
  }
}

概念 SQL

SELECT id, title
FROM Books
WHERE title LIKE '%Chronicles';

in

成员资格匹配。 返回提供的列表中存在字段值的记录。

在此示例中,我们获得了其流派为“SciFi”或“幻想”的书籍。

query {
  books(filter: { genre: { in: ["SciFi", "Fantasy"] } }) {
    items { id title genre }
  }
}

概念 SQL

SELECT id, title, genre
FROM Books
WHERE genre IN ('SciFi', 'Fantasy');

isNull

Null 检查。 返回字段的值为 null 或不为 null 的记录,具体取决于布尔文本。

在此示例中,我们将获取评级为 null 的书籍。

query {
  books(filter: { rating: { isNull: true } }) {
    items { id title rating }
  }
}

概念 SQL

SELECT id, title, rating
FROM Books
WHERE rating IS NULL;

示例配置

{
  "runtime": {
    "pagination": {
      "default-page-size": 100,
      "max-page-size": 100000
    }
  },
  "entities": {
    "Book": {
      "source": {
        "type": "table",
        "object": "dbo.books"
      },
      "mappings": {
        "sku_title": "title",
        "sku_price": "price"
      },
      "relationships": {
        "book_category": {
          "cardinality": "one",
          "target.entity": "Category",
          "source.fields": [ "category_id" ],
          "target.fields": [ "id" ]
        }
      }
    },
    "Category": {
      "source": {
        "type": "table",
        "object": "dbo.categories"
      },
      "relationships": {
        "category_books": {
          "cardinality": "many",
          "target.entity": "Book",
          "source.fields": [ "id" ],
          "target.fields": [ "category_id" ]
        }
      }
    }
  }
}

另请参阅

概念 REST GraphQL 目的
投影 $select 物品 选择要返回的字段
Filtering $filter 滤波器 按条件限制行
排序 $orderby orderBy 定义排序顺序
页面大小 $first first 限制每页的项数
延续 $after 使用光标从最后一页继续

注释

REST 关键字以 $遵循 OData 约定开头。