根据 Azure 数据工厂中的第二次查找中的值筛选查找结果

Gee*_*ekn 3 azure-data-factory

我在 ADF 的 Until 活动中进行了两次查找。第一个查找 ( BookList) 是类似于下面列出的 JSON 的书籍列表。

[
  {
    "BookID": 1,
    "BookName": "Book A"
  },
  {
    "BookID": 2,
    "BookName": "Book B"
  }
]
Run Code Online (Sandbox Code Playgroud)

ExcludedBooks第二个查找是我想要从下面列出的第一个列表 ( ) 中排除的书籍列表。

[
  {
    "BookID": 2,
    "BookName": "Book B"
  }
]
Run Code Online (Sandbox Code Playgroud)

在这两次查找之后,我有一个 Filter 活动,其项目是查找中的值BookList。我希望过滤条件基于未在值中列出的 BookID 值ExcludedBooks,但我不确定如何根据 ADF 中的集合函数编写此条件。我所拥有的在下面列出,但不起作用。

@not(contains(activity('ExcludedBooks').output.value, item().BookID))
Run Code Online (Sandbox Code Playgroud)

我意识到解决此问题的一种方法是循环遍历 ExcludedBooks 的每条记录,并使用 SetVariable 活动构建 BookID 数组,该数组可以与集合函数 Contains() 一起使用,但由于某种原因,ADF 不允许嵌套活动组( ForEach 内的 Until)。

我也无法在 Until 活动之外设置排除的书籍列表,因为它会随着 Until 活动的每次迭代而变化。我还意识到嵌套组活动限制的解决方法是创建一个完全不同的管道,但这并不理想,并且在尝试返回结果时会产生不必要的复杂性。

有人对如何根据另一个查找的结果过滤查找结果有任何建议吗?

Ste*_*son 6

下面的表达式不起作用,因为 item 是activity('ExcludedBooks').output.value对象,item().BookID是数字。

@not(contains(activity('ExcludedBooks').output.value, item().BookID))

如果您的每个项目ExcludedBooks与您的项目相同BookList(例如您提供的样品),您可以使用以下表达式:@not(contains(activity('ExcludedBooks').output.value, item()))

我的测试结果:

在此输入图像描述

另一方面,如果您的项目ExcludedBooks像这样的 json(BookList与您提供的相同):

[
  {
    "BookID": 2,
    "BookName": "Book B",
    "num": 22
  }
]
Run Code Online (Sandbox Code Playgroud)

您只能BookID使用以下表达式来比较它们: @not(contains(join(activity('ExcludedBooks').output.value,','),concat('"BookID":',item().BookID,',')))

(转换activity('ExcludedBooks').output.value为字符串,在 'BookList' 中 concat item() as"BookID":2,并检查 'ExcludedBooks' 字符串是否包含 'BookList' 项目字符串)

我的测试结果: 在此输入图像描述

希望这可以帮到你。