แบบสอบถาม LINQ เพื่อเลือกห้าอันดับแรก


234

ฉันมีคำสั่ง LINQ:

var list = from t in ctn.Items
           where t.DeliverySelection == true && t.Delivery.SentForDelivery == null
           orderby t.Delivery.SubmissionDate
           select t;

ฉันจะแก้ไขเคียวรีนี้เพื่อเลือกผลลัพธ์ห้ารายการจากฐานข้อมูลได้อย่างไร


ใช้เวลา (how_many_you_wish)
snr

คำตอบ:


437
var list = (from t in ctn.Items
           where t.DeliverySelection == true && t.Delivery.SentForDelivery == null
           orderby t.Delivery.SubmissionDate
           select t).Take(5);

5
+1, แต่ gah, ใส่เครื่องหมายหลายบรรทัดไว้ในวงเล็บแล้วยกเลิกการอ้างอิงล็อตทั้งหมดทำให้ฉันไม่พอใจด้วยเหตุผลบางอย่าง
หมอโจนส์

6
สิ่งนี้ดูเหมือนว่าจะได้ผลลัพธ์จากฐานข้อมูลมากที่สุดเท่าที่ตรงกับเงื่อนไขความเท่าเทียมกันและหลังจากที่พวกเขาถูกนำมาจากฐานข้อมูลแล้วจะใช้ข้อ จำกัด take (5) ภายในแอปพลิเคชัน มีวิธีการที่แท้จริงtakeเพียง 5 แถวแรกจากฐานข้อมูลหรือไม่
JM Hicks

6
@JMHicks ไม่ได้จริงๆ คำสั่ง Take (5) เป็นเพียงการเพิ่มเงื่อนไขอื่นให้กับ IQueryable ซึ่งจะไม่ดำเนินการจนกว่าคุณจะระบุ อย่างไรก็ตามอาจมีผู้ให้บริการ LINQ ที่ไม่สนับสนุนการดำเนินการ
Bruno Brant

1
@JMHicks - นั่นไม่ใช่วิธีที่ linq ใช้งานได้ ... linq ขี้เกียจ
โฮแกน

39

การแก้ไขปัญหา:

var list = (from t in ctn.Items
           where t.DeliverySelection == true && t.Delivery.SentForDelivery == null
           orderby t.Delivery.SubmissionDate
           select t).Take(5);

19

สิ่งนี้สามารถทำได้โดยใช้วิธีการของแลมบ์ดาจาก Linq

var list = ctn.Items
.Where(t=> t.DeliverySelection == true && t.Delivery.SentForDelivery == null)
.OrderBy(t => t.Delivery.SubmissionDate)
.Take(5);

8

[เสนอคำตอบที่สื่อความหมายมากกว่าคำตอบของ@Ajni ]

สิ่งนี้สามารถทำได้โดยใช้ไวยากรณ์ LINQ ได้อย่างคล่องแคล่ว :

var list = ctn.Items
    .Where(t=> t.DeliverySelection == true && t.Delivery.SentForDelivery == null)
    .OrderBy(t => t.Delivery.SubmissionDate)
    .Take(5);

โปรดทราบว่าแต่ละวิธี ( Where, OrderBy, Take) ที่ปรากฏในงบ LINQ นี้จะใช้เวลาการแสดงออกแลมบ์ดาเป็นอาร์กิวเมนต์ โปรดทราบว่าเอกสารสำหรับการEnumerable.Takeเริ่มต้นด้วย:

ส่งคืนจำนวนองค์ประกอบที่ต่อเนื่องที่ระบุจากจุดเริ่มต้นของลำดับ


5

Additional information

บางครั้งก็เป็นสิ่งที่จำเป็นในการผูกแบบเป็นรูปแบบมุมมองและให้ข้อผิดพลาดการแปลงชนิด ในสถานการณ์เช่นนี้คุณควรใช้ToList()วิธีการ

var list = (from t in ctn.Items
       where t.DeliverySelection == true && t.Delivery.SentForDelivery == null
       orderby t.Delivery.SubmissionDate
       select t).Take(5).ToList();

0

แค่คิดว่าคุณอาจรู้สึกไม่คุ้นเคยกับลำดับจาก -> ที่ไหน -> เลือกเช่นเดียวกับในสคริปต์ sql มันก็เหมือนSelect-> From-> Where

แต่คุณอาจไม่ทราบว่าใน Sql Engine นั้นจะแยกตามลำดับของ 'จาก-> ที่ไหน -> เลือก ' เพื่อตรวจสอบมันคุณสามารถลองสคริปต์ง่าย ๆ

select id as i from table where i=3

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

select * from (select id as i from table) as t where i = 3
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.