Expression.Evaluate ใช้สำหรับประเมินผลนิพจน์ M ที่เก็บไว้เป็นข้อความ โดยสามารถระบุตัวแปรและฟังก์ชันที่ใช้ได้ในสภาพแวดล้อม ทำให้สามารถเขียนโค้ด M แบบไดนามิก
| อาร์กิวเมนต์ | ชนิด | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
| document | text | นิพจน์ M ที่เก็บไว้เป็นข้อความสตริง ต้องเป็นโค้ด M ที่ถูกต้องตามไวยากรณ์ | |
| [environment]ไม่บังคับ | record | null | record ที่ประกอบด้วยตัวแปรและฟังก์ชันที่ต้องการให้เข้าถึงได้ในนิพจน์ (เช่น [x = 5, y = 10] หรือ #shared สำหรับสภาพแวดล้อมทั่วโลก) |
[ ] = อาร์กิวเมนต์ที่ไม่บังคับ
Expression.Evaluate ใช้สำหรับประเมินผลนิพจน์ M ที่เก็บไว้เป็นข้อความ โดยสามารถระบุตัวแปรและฟังก์ชันที่ใช้ได้ในสภาพแวดล้อม ทำให้สามารถเขียนโค้ด M แบบไดนามิก
ที่เจ๋งคือ Expression.Evaluate ให้เราสร้างนิพจน์ M แบบไดนามิก แล้วประเมินผลในขั้นตอน Query ได้ ซึ่งมีประโยชน์มากเมื่อต้องสร้างฟิลเตอร์ หรือโค้ด M ที่เปลี่ยนแปลงตามเงื่อนไข
ส่วนตัวผม เห็นว่า Expression.Evaluate มีประโยชน์ที่สุดเมื่อต้องเรียกใช้ฟังก์ชัน Power Query ที่เก็บไว้ในไฟล์อื่น หรือสร้างนิพจน์ที่ซับซ้อนแบบโปรแกรมแนว (programmatic) ได้ แต่ต้องระวังเรื่องประสิทธิภาพเพราะ dynamic evaluation อาจช้ากว่าโค้ด static ที่เขียนตรงๆ
ประเมินผลการบวกแบบง่าย โดยไม่ต้องมีสภาพแวดล้อม ผลลัพธ์คือเลข 2
ส่งตัวแปร x และ y ผ่าน environment record เพื่อใช้ในนิพจน์ ผลลัพธ์คือ 42
ถ้าไม่ส่ง List.Sum ในสภาพแวดล้อม จะเกิดข้อผิดพลาด 'List.Sum' doesn't exist ต้องใส่ [List.Sum = List.Sum] เพื่อให้ฟังก์ชันสามารถใช้ได้
#shared ให้เข้าถึงฟังก์ชัน Power Query ทั้งหมด (global environment) ทำให้ไม่ต้องเขียน [List.Sum = List.Sum] ซ้ำ
ประเมินผล let…in expression ที่เก็บไว้เป็นข้อความ ผลลัพธ์คือ 12 (3 * 4) ทำให้สามารถสร้างโค้ด M ที่มีการประกาศตัวแปรแบบไดนามิก
ใช้ Expression.Constant() เพื่อแปลงค่าเป็นโค้ด M และ Expression.Identifier() สำหรับตัวแปร จากนั้นต่อเข้าด้วยกัน ผลลัพธ์คือสตริง "abcdef"
ไม่จำเป็น ถ้านิพจน์ไม่มีการอ้างอิงตัวแปรหรือฟังก์ชันใดๆ สามารถไม่ส่ง environment ได้ เช่น Expression.Evaluate("1 + 1") ใช้ได้เลย แต่ถ้ามีการอ้างอิงฟังก์ชัน เช่น List.Sum ต้องใส่ในสภาพแวดล้อมหรือใช้ #shared
#shared ให้เข้าถึงฟังก์ชันและตัวแปรทั่วโลกของ Power Query ส่วน record ที่ส่งเป็น environment มีแต่สิ่งที่ระบุเท่านั้น ถ้าต้องใช้ฟังก์ชัน List.Sum ด้วย ต้องใส่ [List.Sum = List.Sum] ในการส่ง record
ได้ แต่ต้องระวังเรื่องประสิทธิภาพ การประเมินผลนิพจน์แต่ละแถวจะช้ากว่าการใช้โค้ด M ที่เขียนตรงๆ ใช้เมื่อจำเป็นจริงๆ เท่านั้น
จะได้ข้อผิดพลาด (error) ที่บอกตำแหน่งและประเภทของข้อผิดพลาด ต้องตรวจสอบนิพจน์ที่ส่งให้เป็นโค้ด M ที่ถูกต้อง
ฟังก์ชันที่ผู้เขียนโยงไว้กับ Expression.Evaluate จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง
Expression.Constant แปลงค่าใด ๆ ให้เป็นข้อความโค้ด M ที่ถูกต้องทางไวยากรณ์ ใช้เมื่อต้องสร้างโค้ด M แบบไดนามิก
Expression.Identifier แปลงชื่อตัวแปรเป็นรูปแบบ M source code ที่ถูกต้อง โดยจัดการกับช่องว่างและอักษรพิเศษอัตโนมัติ
Function.From ใช้เพื่อแปลงฟังก์ชันที่รับเฉพาะลิสต์เดียว (unary function) ให้กลายเป็นฟังก์ชันที่รับพารามิเตอร์แยกกัน
Function.Invoke เรียกใช้ฟังก์ชันโดยส่งรายการอาร์กิวเมนต์เป็นพารามิเตอร์ ใช้สำหรับการเรียกฟังก์ชันแบบไดนามิก
ยังไม่มีบทความที่เกี่ยวข้องกับฟังก์ชันนี้
Comments
อีเมลของคุณจะไม่ถูกเผยแพร่