Expression.Evaluate ใช้สำหรับประเมินผลนิพจน์ M ที่เก็บไว้เป็นข้อความ โดยสามารถระบุตัวแปรและฟังก์ชันที่ใช้ได้ในสภาพแวดล้อม ทำให้สามารถเขียนโค้ด M แบบไดนามิก
=Expression.Evaluate(document as text, optional environment as nullable record) as any
=Expression.Evaluate(document as text, optional environment as nullable record) as any
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| document | text | Yes | นิพจน์ M ที่เก็บไว้เป็นข้อความสตริง ต้องเป็นโค้ด M ที่ถูกต้องตามไวยากรณ์ | |
| environment | record | Optional | null | record ที่ประกอบด้วยตัวแปรและฟังก์ชันที่ต้องการให้เข้าถึงได้ในนิพจน์ (เช่น [x = 5, y = 10] หรือ #shared สำหรับสภาพแวดล้อมทั่วโลก) |
Expression.Evaluate("1 + 1")= Expression.Evaluate("1 + 1")
2
Expression.Evaluate("x + y", [x = 17, y = 25])= Expression.Evaluate("x + y", [x = 17, y = 25])
42
Expression.Evaluate("List.Sum({1, 2, 3})", [List.Sum = List.Sum])= Expression.Evaluate("List.Sum({1, 2, 3})", [List.Sum = List.Sum])
6
Expression.Evaluate("List.Sum({5, 10, 15})", #shared)= Expression.Evaluate("List.Sum({5, 10, 15})", #shared)
30
Expression.Evaluate("let a=3, b=4, c=a*b in c")= Expression.Evaluate("let a=3, b=4, c=a*b in c")
12
Expression.Evaluate( Expression.Constant("abc") & " & " & Expression.Identifier("x"), [x = "def"] )= Expression.Evaluate(
Expression.Constant("abc") & " & " & Expression.Identifier("x"),
[x = "def"]
)
"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 ใช้สำหรับประเมินผลนิพจน์ M ที่เก็บไว้เป็นข้อความ โดยสามารถระบุตัวแปรและฟังก์ชันที่ใช้ได้ในสภาพแวดล้อม ทำให้สามารถเขียนโค้ด M แบบไดนามิก
ที่เจ๋งคือ Expression.Evaluate ให้เราสร้างนิพจน์ M แบบไดนามิก แล้วประเมินผลในขั้นตอน Query ได้ ซึ่งมีประโยชน์มากเมื่อต้องสร้างฟิลเตอร์ หรือโค้ด M ที่เปลี่ยนแปลงตามเงื่อนไข
ส่วนตัวผม เห็นว่า Expression.Evaluate มีประโยชน์ที่สุดเมื่อต้องเรียกใช้ฟังก์ชัน Power Query ที่เก็บไว้ในไฟล์อื่น หรือสร้างนิพจน์ที่ซับซ้อนแบบโปรแกรมแนว (programmatic) ได้ แต่ต้องระวังเรื่องประสิทธิภาพเพราะ dynamic evaluation อาจช้ากว่าโค้ด static ที่เขียนตรงๆ