ฉันจะทำ SELECT UNIQUE กับ LINQ ได้อย่างไร?


96

ฉันมีรายการดังนี้:

Red
Red
Brown
Yellow
Green
Green
Brown
Red
Orange

ฉันพยายามทำ SELECT UNIQUE ด้วย LINQ เช่นฉันต้องการ

Red
Brown
Yellow
Green
Orange

var uniqueColors = from dbo in database.MainTable
                   where dbo.Property == true
                   select dbo.Color.Name;

จากนั้นฉันก็เปลี่ยนสิ่งนี้เป็น

var uniqueColors = from dbo in database.MainTable
                   where dbo.Property == true
                   select dbo.Color.Name.Distinct();

โดยไม่ประสบความสำเร็จ ครั้งแรกselectได้รับสีทั้งหมดดังนั้นฉันจะแก้ไขเพื่อให้ได้ค่าที่ไม่ซ้ำกันได้อย่างไร

หากมีวิธีที่ดีกว่าในการจัดโครงสร้างแบบสอบถามนี้ยินดีที่จะไปตามเส้นทางนั้น

ฉันจะแก้ไขมันได้อย่างไรเพื่อให้ฉันมี.OrderBy( "column name" )ชื่อสีตามตัวอักษรดังนั้นคุณสมบัติชื่อ

ฉันได้รับข้อความ:

อาร์กิวเมนต์ประเภทไม่สามารถอนุมานได้จากการใช้งาน ลองระบุประเภทอาร์กิวเมนต์อย่างชัดเจน

คำตอบ:


159

Distinct()เป็นไปเลอะการสั่งซื้อเพื่อให้คุณจะต้องเรียงลำดับหลังจากนั้น

var uniqueColors = 
               (from dbo in database.MainTable 
                 where dbo.Property == true 
                 select dbo.Color.Name).Distinct().OrderBy(name=>name);

3
ขอบคุณนี่คือคำตอบที่ถูกต้อง ใครช่วยอธิบายสิ่งที่เกิดขึ้นในพารามิเตอร์. OrderBy () คุณมีชื่อ => ชื่อ ชื่อนั้นมาจากชื่อคอลัมน์ใน DB หรือไม่? เพราะเรามีdbo.Color.Nameแล้วเพียงname=>nameซึ่งคำแนะนำกับผมมันไม่ได้เป็นชื่อคอลัมน์? มันแปลกมากถ้าฉันเปลี่ยนเป็น.OrderBy(a=>a)
บารอน

3
ชื่อของตัวแปรไม่เกี่ยวข้อง เป็นเพียง {object ถูกส่งไปยัง function} => {object used to sort} เนื่องจากเราได้ทำการเลือกไปแล้วสิ่งเดียวในคอลเลกชั่นที่ถูกจัดเรียงคือชื่อ
James Curran

ขอบคุณ @JamesCurran โซลูชันของคุณช่วยฉันได้มาก
รอน

ดูเหมือนว่าจะดีถ้ามี OrderBy () สำหรับการสั่งซื้อโดยวัตถุ / ระเบียนทั้งหมด วิธีการขยายจะยังคงเรียกผู้รับมอบสิทธิ์โดยไม่มีเหตุผล
NetMage

@NetMage - ชี้แจงว่าคุณหมายถึง "ทั้งวัตถุ / บันทึก" ทุกสนาม? เรียงตามลำดับอะไร รวมถึงคีย์หลัก?
James Curran


10

การใช้ไวยากรณ์การทำความเข้าใจแบบสอบถามคุณสามารถบรรลุตามลำดับดังนี้

var uniqueColors = (from dbo in database.MainTable
                    where dbo.Property
                    orderby dbo.Color.Name ascending
                    select dbo.Color.Name).Distinct();

อืม ... ไม่ได้เรียงตามตัวอักษร - ด้วยเหตุผลบางอย่าง ... ฉันเปลี่ยนจากน้อยไปมากและจากมากไปหาน้อยและได้ผลลัพธ์แบบเดียวกัน คำสั่งที่แตกต่างมีผลต่อหรือไม่? อาจจะต้องสั่งซื้อหลังจากนั้น?
บารอน

สามารถลอง var uniqueColors = จากผลลัพธ์ใน (จาก dbo ใน database.MainTable โดยที่ dbo.Property เลือก dbo.Color.Name) .Distinct () orderby ผลลัพธ์จากน้อยไปมาก;
cordialgerm
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.