เหตุผลในการตั้งชื่อ. NETs Select (Map) และ Aggregate (ลด) คืออะไร?


17

ในภาษาการเขียนโปรแกรมอื่น ๆ ฉันได้เห็น Map and Reduce และสิ่งเหล่านี้เป็นสิ่งสำคัญสำหรับการเขียนโปรแกรมการทำงาน ฉันไม่พบเหตุผลหรือประวัติว่าทำไม LINQ จึงมีAggregate(เหมือนReduce) และSelect(เหมือนกัน)Map )?

ทำไมฉันถึงถามว่ามันใช้เวลาพอสมควรที่จะเข้าใจว่ามันเป็นสิ่งเดียวกันและฉันอยากรู้ว่าอะไรคือเหตุผลสำหรับเรื่องนี้




ในทางกลับกันฉันชอบที่จะรู้เหตุผลของการเลือกชื่อ "แผนที่" และการรวม "ลด" เพื่อเริ่มต้นด้วย
Den

คำตอบ:


32

สิ่งนี้ส่วนใหญ่เกิดขึ้นในประวัติศาสตร์ของ LINQ

LINQ เดิมทีตั้งใจให้เป็นแบบ SQL และใช้ (ส่วนใหญ่ แต่ไม่เฉพาะ) เพื่อเชื่อมต่อกับฐานข้อมูล SQL สิ่งนี้นำไปสู่คำศัพท์ส่วนใหญ่ที่อิงกับ SQL

ดังนั้น "เลือก" มาจากของ SQL selectคำสั่งและ "รวม" มาจากฟังก์ชันการรวม SQL (เช่นcount, sum, avg, min, max)

สำหรับผู้ที่ตั้งคำถามกับระดับที่ LINQ เดิมเกี่ยวข้องกับ SQL ฉันจะอ้างถึง (ตัวอย่าง) บทความของ Microsoft เกี่ยวกับCωซึ่งเป็นภาษาที่คิดค้นโดย Microsoft Research และดูเหมือนจะเป็นที่ที่พื้นฐานของ LINQ ทำงาน ก่อนที่จะเพิ่มลงใน C # และ. NET

ตัวอย่างเช่นพิจารณาบทความ MSDN ในCωซึ่งระบุว่า:

ผู้ประกอบการสืบค้นในCω

Cωเพิ่มคลาสของตัวดำเนินการคิวรีสองคลาสในภาษา C #:
- โอเปอเรเตอร์ที่ใช้ XPath สำหรับการค้นหาตัวแปรสมาชิกของวัตถุตามชื่อหรือตามประเภท
- ตัวดำเนินการบน SQL สำหรับการดำเนินการแบบสอบถามที่ซับซ้อนที่เกี่ยวข้องกับการประมาณการการจัดกลุ่มและการเข้าร่วมข้อมูลจากวัตถุหนึ่งหรือมากกว่า

อย่างน้อยเท่าที่ฉันรู้ตัวดำเนินการตาม XPath ไม่เคยถูกเพิ่มลงใน C # เหลือเพียงตัวดำเนินการที่ได้รับการบันทึกไว้ (ก่อนที่ LINQ จะมีอยู่) เป็นการอ้างอิงโดยตรงบน SQL

ตอนนี้มันเป็นความจริงอย่างแน่นอนที่ LINQ ไม่เหมือนกับผู้ดำเนินการคิวรี่ที่ใช้ SQL ในCω โดยเฉพาะอย่างยิ่ง LINQ จะติดตามวัตถุพื้นฐานของ C # และการเรียกใช้ฟังก์ชันของไวยากรณ์อย่างใกล้ชิดกว่าCω คิวรี C followed ติดตามไวยากรณ์ SQL อย่างใกล้ชิดยิ่งขึ้นดังนั้นคุณสามารถเขียนสิ่งนี้ (อีกครั้งซึ่งดึงโดยตรงจากบทความที่ลิงก์ด้านบน):

 rows = select c.ContactName, o.ShippedDate
      from c in DB.Customers
      inner join o in DB.Orders
      on c.CustomerID == o.CustomerID;

และใช่บทความเดียวกันพูดคุยกันโดยเฉพาะเกี่ยวกับการใช้แบบสอบถามที่ยึดตาม SQL เพื่อสืบค้นข้อมูลที่มาจากฐานข้อมูล SQL จริง:

ในการเชื่อมต่อกับฐานข้อมูล SQL ในCωจะต้องมีการเปิดเผยเป็นแอสเซมบลีที่มีการจัดการ (นั่นคือไฟล์ไลบรารี. NET) ซึ่งถูกอ้างอิงโดยแอปพลิเคชัน ฐานข้อมูลเชิงสัมพันธ์สามารถสัมผัสกับCωเป็นแอสเซมบลีที่มีการจัดการอย่างใดอย่างหนึ่งโดยใช้เครื่องมือบรรทัดคำสั่งsql2comega.exeหรือกล่องโต้ตอบเพิ่มสคีมาฐานข้อมูล ...จากภายใน Visual Studio วัตถุฐานข้อมูลถูกใช้โดยCωเพื่อแสดงฐานข้อมูลเชิงสัมพันธ์ที่โฮสต์โดยเซิร์ฟเวอร์ ฐานข้อมูลวัตถุมีทรัพย์สินของประชาชนในแต่ละตารางหรือมุมมองและวิธีการในการทำงานแต่ละตารางมูลค่าที่พบในฐานข้อมูล ในการสืบค้นฐานข้อมูลเชิงสัมพันธ์ต้องระบุฟังก์ชันตารางมุมมองหรือตารางที่มีค่าเป็นอินพุตของตัวดำเนินการที่ใช้ SQL หนึ่งตัวขึ้นไป

ตัวอย่างโปรแกรมและผลลัพธ์ต่อไปนี้แสดงความสามารถบางอย่างของการใช้ตัวดำเนินการบน SQL เพื่อสอบถามฐานข้อมูลเชิงสัมพันธ์ในCω ฐานข้อมูลที่ใช้ในตัวอย่างนี้คือตัวอย่างฐานข้อมูล Northwind ที่มาพร้อมกับ Microsoft SQL Server DB ชื่อที่ใช้ในตัวอย่างหมายถึงอินสแตนซ์ระดับโลกของวัตถุฐานข้อมูลในNorthwind namespace ของNorthwind.dllประกอบสร้างขึ้นโดยใช้sql2comega.exe

ดังนั้นใช่จากจุดเริ่มต้น (หรือแม้กระทั่งก่อนที่จะเริ่มต้นขึ้นอยู่กับมุมมองของคุณ) LINQ ขึ้นอยู่กับ SQL อย่างชัดเจนและมีจุดประสงค์เพื่อให้สามารถเข้าถึงข้อมูลในฐานข้อมูล SQL ได้อย่างชัดเจน


5
ฉันไม่เห็นด้วยที่ LINQ ถูกคิดค้นสำหรับการสืบค้น SQL LINQ ขึ้นอยู่กับการดำเนินการค้นหาในซึ่งจะสืบทอดมาจากX♯ซึ่งอิงจากกระดาษ Haskell รุ่นเก่า โปรดทราบว่าหนึ่งในผู้เขียนของเอกสาร Haskell กล่าวคือ Erik Meijer ซึ่งเกี่ยวข้องกับการออกแบบX♯และCωหลังจากนั้นและเป็นผู้ออกแบบ LINQ และชัดเจนตั้งแต่ต้นว่า LINQ สามารถใช้ในการค้นหาทุกประเภทไม่ใช่แค่ SQL (มันมาพร้อมกับ LINQ-to-SQL, LINQ-to-XML และ LINQ-to-Objects จากวันที่ 1 ในไม่ช้า ตามด้วย…
Jörg W Mittag

4
LINQ-to-Entities) และในความเป็นจริงมากกว่าการสืบค้น (โดยทั่วไปคือไวยากรณ์Monad Comprehensionทั่วไป) มันถูกออกแบบมาเพื่อความคุ้นเคยกับโปรแกรมเมอร์ SQL (และ XQuery) แต่ไม่ จำกัด เฉพาะ ในหลอดเลือดดำที่คล้ายกัน Monala Comprehensions มีลักษณะเหมือนforลูปและ Haskell มีลักษณะคล้ายกับบล็อกรหัส C-style ที่จำเป็นและ Scala เรียกการทำงานแบบ Monadic flatMapและ Haskell เรียกมันว่าreturnด้วยเหตุผลเดียวกัน: เพื่อให้เข้ากับ "ภาพลวงตา" ป้องกัน (อดีต) โปรแกรมเมอร์ที่จำเป็น
Jörg W Mittag

2
@ JörgWMittag: ดูคำตอบที่แก้ไขแล้ว ฉันเชื่อว่าเอกสารของ Microsoft รองรับคำสั่งของฉัน
Jerry Coffin

3
+1 สำหรับการพิสูจน์คำตอบที่แท้จริงแทนที่จะคาดเดา คุณไม่สามารถรับแหล่งข้อมูลที่เชื่อถือได้มากกว่า Microsoft เอง
milleniumbug

ขอบคุณครับท่าน! นี่เป็นคำตอบที่ฉันหวังว่าจะได้รับอย่างแน่นอน
Tx3

8

วิธี LINQ ใน. สุทธิ

source.Where(x => condition)
      .Select(x => projection)

ถูกตั้งชื่อให้สอดคล้องกับไวยากรณ์คิวรี LINQ ใน C # (และ VB.NET)

from x in source
where condition
select projection

ซึ่งถูกออกแบบมาให้คุ้นเคยกับผู้ที่รู้จัก SQL

SELECT projection
FROM source x
WHERE condition

2

ให้ฉันเลือกและรวมทำให้รู้สึกมากขึ้น เมื่อเอนทิตีกลายเป็นวิธีการที่โดดเด่นในการสืบค้นและจัดการข้อมูลใน. Net Linq จึงมีการใช้งานมากขึ้นเรื่อย ๆ โดยนักพัฒนาที่อาจเคยชินกับการทำงานกับข้อมูลผ่าน SQL ดังนั้นการใช้คำเช่น "เลือก" จึงเหมาะสมกว่าสำหรับนักพัฒนาเหล่านั้นเนื่องจากเป็นคำหลักที่พวกเขาคุ้นเคย


4
"มากขึ้นโดยนักพัฒนาที่อาจคุ้นเคยกับการทำงานกับข้อมูลผ่าน SQL" ฉันสงสัยในเรื่องนี้ คนที่ฉันทำงานด้วยที่ร้องเพลงสรรเสริญ Entity Framework ไม่สามารถเข้าใจได้ว่าเขาต้องทำอะไรซักINNER JOINอย่างในวันเดียวเมื่อเอนทิตี Framework ไม่ใช่ตัวเลือก อาจเป็นสิ่งที่ตรงกันข้าม ผู้คนจำนวนมากใช้ LINQ ทุกวันซึ่งหลีกเลี่ยงการเขียน SQL อย่างแข็งขัน ผู้ที่คุ้นเคยกับ SQL อาจทำได้มากกว่าใน SQL
jpmc26

1
นั่นไม่ใช่สิ่งที่ฉันเห็น ส่วนใหญ่สิ่งที่ฉันค้นหา (ผ่านการค้นหางานล่าสุดของฉัน) คือนักพัฒนาที่เคยทำงานกับข้อมูลโดยใช้ Stored กระบวนงานเริ่มทำสคริปต์ทั้งหมดในคอนโทรลเลอร์ สำหรับฉันมันช่วยให้ Linq ใช้การแสดงออกที่คุ้นเคย ฉันไม่สงสัยเลยว่าเป็นกรณีของ "คนที่คุณทำงานด้วย" แต่นั่นไม่ใช่ประสบการณ์ของฉัน
Christine
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.