การใช้ string.Concat และเครื่องหมาย + ใน EntityFramework Core

wk
1 min readFeb 15, 2019

--

string.Concat และ + ให้ผลลัพธ์เหมือนกัน แต่ประสิทธิภาพต่างกัน

ตัวอย่าง

ต้องการ Query ข้อมูลที่เมื่อนำ Column N1 และ N2 รวมกันแล้วมีข้อความ SAWin ประกอบอยู่ สามารถเขียน Query ทั้งสองแบบได้ดังนี้

var query =
from a in context.TableA
join b in context.TableB on a.Id equals b.Reference
select new {
A = a.N1,
B = b.N2,
};
var queryA = query.Where(x => string.Concat(x.A, x.B)
.Contains("SAWin"));
var queryB = query.Where(x => (x.A + x.B)
.Contains("SAWin"));

queryA จะถูกแปลงเป็น SQL ดังนี้

SELECT a."N1" AS "A", b."N2" AS "B"
FROM "TableA" AS a
INNER JOIN "TableB" AS b ON a."Id" = b."Reference"

queryB

SELECT a."N1" AS "A", b."N2" AS "B"
FROM "TableA" AS a
INNER JOIN "TableB" AS b ON a."Id" = b."Reference"
WHERE STRPOS((a."N1" || b."N2"), 'SAWin') > 0

จะเห็นว่า queryA เป็น SQL ที่ไม่สมบูรณ์ เนื่องจากโปรแกรมไม่สามารถแปลงคำสั่ง string.Concat เป็น SQL statment ได้ โปรแกรมจะดึงข้อมูลทั้งหมดจากฐานข้อมูล และ Filter ตามเงื่อนไขในภายหลัง

The LINQ expression 'where Concat([a].N1, [b].N2).Contains("SAWin")' could not be translated and will be evaluated locally.

จะต่างจาก queryB ที่เงื่อนไขการ Query จะถูกแปลงเป็น SQL ทั้งหมด ซึ่งจะผลักภาระในการประมวลผลไปให้ DBMS

ข้อควรระวังในการใช้ queryA คือ ถ้าในฐานข้อมูลมีข้อมูลจำนวนมากอาจทำให้โปรแกรมทำงานช้าลงเนื่องจากต้องใช้ CPU และ Memory เพิ่มขึ้น

--

--

No responses yet