มันคือ Linq หรือ Lambda?


106

ฉันรู้ว่านี่คือ Linq:

var _Results = from item in _List
                where item.Value == 1
                select item;

และฉันรู้ว่านี่คือแลมด้า:

var _Results = _List.Where(x => x.Value == 1);

หมายเหตุบรรณาธิการ:ข้างต้นไม่ได้เป็นเพียง Lambda แต่เป็น Linq ที่ใช้ "Method Syntax" ซึ่งมีเพรดิเคตเป็น Lambda เพื่อความชัดเจนทั้งสองตัวอย่างข้างต้นคือ Linq (โพสต์ต้นฉบับของฉันไม่ถูกต้อง แต่ฉันทิ้งข้อผิดพลาดไว้เพื่อแสดงให้เห็นถึงความสับสนที่ทำให้เกิดคำถาม)

แต่ Linq เป็นส่วนย่อยของ Lambda หรืออะไร?

เหตุใดจึงมีสองเทคโนโลยีที่ดูเหมือนกัน

มีเหตุผลทางเทคนิคในการเลือกอย่างใดอย่างหนึ่งหรือไม่?


2
การแก้ไข: lambdaexpression.net
Jerry Nixon

คำตอบ:


135

นี่คือ LINQ (โดยใช้ไวยากรณ์การสืบค้น):

var _Results = from item in _List
                where item.Value == 1
                select item;

นี่คือ LINQ (โดยใช้ไวยากรณ์วิธี):

var _Results = _List.Where(x => x.Value == 1);

เป็นเรื่องน่าสนใจที่จะทราบว่าทั้งสองรสชาตินี้จะลงเอยด้วยรหัสเดียวกัน คอมไพเลอร์เสนอบริการให้คุณโดยให้คุณแสดงความปรารถนาในลักษณะที่คุณต้องการ

และนี่คือแลมด้า:

x => x.Value == 1

เมื่อคุณเลือกใช้ method syntax, LINQ มักจะเห็นอยู่รอบ ๆ นิพจน์ lambda แต่LINQและlambdasเป็นสองสิ่งที่แตกต่างกันโดยสิ้นเชิงซึ่งทั้งสองอย่างสามารถใช้ด้วยตัวเองได้

ปรับปรุง:ในฐานะที่เป็น svick ถูกต้องชี้ให้เห็น LINQ กับไวยากรณ์แบบสอบถามยังดำเนินการโดยใช้การแสดงออกแลมบ์ดา (ตามที่ระบุไว้ก่อนหน้าคอมไพเลอร์ช่วยให้คุณสามารถที่จะเขียนในไวยากรณ์แบบสอบถาม แต่มีประสิทธิภาพในการแปลงมันไวยากรณ์วิธีด้านหลังของคุณ) นี่เป็นเพียงการซ้อนความจริงที่ว่าทั้งสองรสชาติมีความเท่าเทียมกันโดยสิ้นเชิงและจะทำงานในลักษณะเดียวกัน (เช่นการแสดงออกของแลมบ์ดาอาจทำให้เกิดการปิด )


2
ฉันคิดว่ามันคุ้มค่าที่จะกล่าวถึงไวยากรณ์ของคิวรีใช้ lambdas อยู่เบื้องหลังด้วย สิ่งนี้มีความสำคัญเนื่องจากการปิด
svick

34

ทั้งคู่คือ Linq คนที่สองคือการใช้ Lambdas

Lambdas เป็นวิธีการแบบอินไลน์ที่คุณกำลังส่งผ่านเป็นพารามิเตอร์ไปยังฟังก์ชัน Where ในตัวอย่างที่สอง

ความแตกต่างระหว่างไวยากรณ์ทั้งสองนี้เป็นรูปแบบของวากยสัมพันธ์เท่านั้น สไตล์ linq ที่สองโดยใช้การเรียกเมธอดคือวิธีการทำงานภายใต้ประทุน ประการแรกมีไว้เพื่อให้ใช้งานง่ายขึ้น / ง่ายขึ้นและคอมไพเลอร์จะแปลงเป็นวิธีการเรียกใช้เบื้องหลัง ควรทำงานเหมือนกันสำหรับแบบสอบถามใด ๆ ที่กำหนดแม้ว่าคอมไพเลอร์อาจเลือกการตีความแบบสอบถาม linq ที่ซับซ้อนแตกต่างจากที่คุณทำเมื่อแปลงเป็นรูปแบบวิธีการ

บทความ MSDN นี้อาจเป็นที่สนใจมากเกินไป: LINQ แบบสอบถามไวยากรณ์เมื่อเทียบกับวิธีไวยากรณ์ ความเกี่ยวข้องที่เฉพาะเจาะจงคือ: "โดยทั่วไปเราขอแนะนำไวยากรณ์การสืบค้นเนื่องจากโดยปกติจะง่ายกว่าและอ่านง่ายกว่าอย่างไรก็ตามไม่มีความแตกต่างทางความหมายระหว่างไวยากรณ์ของวิธีการและไวยากรณ์ของข้อความค้นหา"


6
โดยส่วนตัวแล้วฉันพบว่าไวยากรณ์ของวิธีการอ่านได้ง่ายกว่า - อาจเป็นเพราะโค้ดส่วนใหญ่ของฉันมีความหลากหลาย "LINQ to Objects" แต่ถ้าคุณมีประสบการณ์ในการใช้งาน SQL เป็นจำนวนมากอาจจะเข้าใจไวยากรณ์ของแบบสอบถามได้ง่ายกว่าในตอนแรก
Tom Bushell

@Tom Bushell แม้แต่ JOIN ไวยากรณ์? อย่างจริงจัง?
Jerry Nixon

@ Tom Bushell: ฉันก็เช่นกัน ฉันกำลังถอดความบางอย่างในหน้า MSDN ซึ่งน่าจะอธิบายได้ว่าทำไมพวกเขาถึงใส่ใจในการพัฒนาไวยากรณ์นั้นแทนที่จะมีเพียงรูปแบบวิธีการ ฉันมักจะทำสิ่งที่ค่อนข้างพื้นฐานมากกว่าการรวมหรือสิ่งอื่นที่ซับซ้อนกว่านั้น (เช่นการกรองส่วนใหญ่หรือการทำแผนที่แบบหนึ่งต่อหนึ่ง)
คริส

@ เจอร์รี่ - เหมือนคริสงาน LINQ ของฉันค่อนข้างง่ายจนถึงตอนนี้ ฉันอ่านมาว่า Query Syntax มักจะดีกว่าเมื่อทำ SelectMany, Join หรือ GroupJoin - ฉันไม่จำเป็นต้องทำอะไรแบบนั้น - แต่!
Tom Bushell

1
"ไวยากรณ์การสืบค้น" ภายในถูกอ้างถึงบน LINQ ถึง SQL และ LINQ ถึงทีมเอนทิตีว่า "ไวยากรณ์ความเข้าใจ"
DamienG
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.