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 เพิ่มขึ้น