次のクエリを検討してください。
let set1=dynamic(["6ab1c993-c138-92ab-abac-49c4d4680812"]);
let set2=dynamic(["6ab1c993c13892ababac49c4d4680812@email.com"]);
let set3=dynamic(["6ab1c993-c138-92ab-abac"]);
let dummyData=datatable(Timestamp:datetime, DynamicData:dynamic) [
datetime(2019-12-30 01:00:00), dynamic({"Id": "6ab1c993-c138-92ab-abac-49c4d4680812", "Email": "6ab1c993c13892ababac49c4d4680812@email.com"})
];
// query1: fails: Relop semantic error: 'has_any' has the following semantic error: SEM0024: The source expression is of type 'dynamic' and cannot be compared with numeric arguments.
dummyData | where DynamicData has_any (toscalar(set1));
//
// query2: succeeds
dummyData | where DynamicData has_any (toscalar(set2));
//
// query3: succeeds
dummyData | where DynamicData has_any (toscalar(set3));
// query4: fails
dummyData | where DynamicData.Id in (toscalar(set1));
最初のクエリは、RHS が数値であると見なされるため失敗します。2 番目と 3 番目のクエリは成功します。値がデータから取得されている場合、今日成功したクエリは後でコンパイル エラーで失敗する可能性があります。
この場合、DynamicData は複雑なプロパティ バッグであるため、in() または set_intersect() はオプションではないことに注意してください。これが in() で機能したとしても、「DynamicData has_any ()」は「DynamicData.child1.child2 in ()」よりも大幅に高速です。
Edit1 : これは in() でも失敗しており、リスト内の値が GUID にマップされる可能性がある場合に発生するようです。
タイトルが更新され、別の例が追加されました。
Edit2 : パフォーマンスを低下させない回避策を見つけました: LHS を tostring でラップします。where tostring(DynamicData) has_any (toscalar(set1));'