จะจัดกลุ่ม IQueryable ตามคุณสมบัติ 1 แต่เรียงลำดับตามคุณสมบัติ 2 ได้อย่างไร

ต่อจากคำถามของฉันก่อนหน้านี้ที่นี่

ฉันใช้

var distinctAllEvaluationLicenses = allEvaluationLicenses.GroupBy((License => License.dateCreated)).OrderByDescending(lics => lics.Key).First();

เพื่อจัดกลุ่ม IQueryable

allEvaluationLicenses 

โดยใช้คุณสมบัติของ License 1 ซึ่งก็คือ 'dateCreated'

แต่ตอนนี้ ฉันจะสั่งซื้อโดยใช้คุณสมบัติอื่น เช่น 'nLicenceID' ได้อย่างไร

เป็นไปได้ไหมที่จะทำสิ่งนี้:

var distinctAllEvaluationLicenses = allEvaluationLicenses.GroupBy((License => License.dateCreated)).OrderByDescending(lics => (sort by nLicenseID here) ).First();

person Mikk    schedule 29.04.2013    source แหล่งที่มา
comment
คุณต้องการเรียงลำดับกลุ่มทั้งหมดหรือไม่ หากเป็นเช่นนั้น จะเกิดอะไรขึ้นหากรายการในกลุ่มไม่เหมือนกันทั้งหมด nLicenseID คุณจะทำอย่างไร หรือคุณหมายถึงการเรียงลำดับตามค่านั้นภายในแต่ละกลุ่ม?   -  person Servy    schedule 29.04.2013
comment
อะไรขัดขวางคุณไม่ให้ทำ lics.Id ตามลำดับแลมบ์ดา   -  person Mohammed Hossain    schedule 29.04.2013
comment
จะเกิดอะไรขึ้นถ้ารายการในกลุ่มไม่มี nLicenseID เหมือนกันทั้งหมด -- ใช่ ฉันทราบเรื่องนี้แล้ว ฉันแค่อยากจะรู้สิ่งนี้ -› คุณหมายถึงการเรียงลำดับตามค่านั้นภายในแต่ละกลุ่มหรือไม่   -  person Mikk    schedule 29.04.2013


คำตอบ (2)


สำหรับ LINQ-to-Objects ออบเจ็กต์ ภายใน แต่ละกลุ่มจะคงลำดับที่ค้นพบ:

ออบเจ็กต์ IGrouping<TKey, TElement> จะได้รับผลตอบแทนตามลำดับตามลำดับขององค์ประกอบในแหล่งที่มาที่สร้างคีย์แรกของแต่ละ IGrouping<TKey, TElement> องค์ประกอบในการจัดกลุ่มจะให้ผลตามลำดับที่ปรากฏในแหล่งที่มา

ดังนั้น: หากเป้าหมายของคุณคือการเรียงลำดับเนื้อหาของแต่ละกลุ่ม เพียงแค่เรียงลำดับแหล่งที่มา:

var distinctAllEvaluationLicenses = allEvaluationLicenses
    .OrderByDescending({whatever})
    .GroupBy({etc}).First(); 

โปรดทราบว่าการดำเนินการนี้ไม่รับประกันว่าจะใช้ได้กับแหล่งที่มา LINQ อื่นๆ และโปรดทราบว่าจะไม่ส่งผลต่อลำดับการนำเสนอ กลุ่ม หากต้องการทำเช่นนั้นคุณอาจทำสิ่งต่อไปนี้:

var distinctAllEvaluationLicenses = allEvaluationLicenses
    .GroupBy({etc}).
    .OrderBy(grp => grp.Min(item => x.SomeProp)).First(); 

ซึ่งจะนำเสนอ กลุ่ม ตามลำดับขั้นต่ำ SomeProp ในแต่ละกลุ่ม เห็นได้ชัดว่าปรับเป็นสูงสุด / ฯลฯ ตามความจำเป็น

person Marc Gravell    schedule 29.04.2013
comment
เขาบอกโดยเฉพาะว่านี่คือ IQueryable ดังนั้นจึง ไม่ใช่ linq ไปยังวัตถุ มันเป็น linq ถึง sql (ตามคำถามก่อนหน้า) - person Servy; 29.04.2013
comment
@Servy IQueryable ไม่ได้บอกอะไรเราเกี่ยวกับแหล่งที่มา LINQ-to-Objects สามารถเปิดเผยเป็น IQueryable น่าแปลกที่ผ่าน .AsQueryable ทีนี้ คำถามก่อนหน้า - ไม่เป็นไร แต่ฉันกำลังตอบคำถามนี้ ไม่ใช่คำถามก่อนหน้า - person Marc Gravell; 29.04.2013
comment
ดังที่ฉันได้กล่าวไว้ ตามคำถามก่อนหน้านี้โดยผู้ใช้รายนี้เกี่ยวกับปัญหานี้ มันคือ linq ถึง sql ไม่ใช่ linq ไปยังอ็อบเจ็กต์ แม้ว่าคุณจะไม่ทราบคำตอบนั้น (ตามหลักการแล้ว) ก็ควรนำไปใช้กับผู้ให้บริการข้อความค้นหาใดๆ หากไม่มีการระบุไว้ ไม่ใช่เพียงผู้ให้บริการข้อความค้นหารายใดรายหนึ่ง (และค่อนข้างไม่น่าจะเป็นไปได้) - person Servy; 29.04.2013

หากต้องการเรียงลำดับรายการภายในกลุ่มคุณสามารถใช้ Select:

var distinctAllEvaluationLicenses = allEvaluationLicenses.GroupBy(License => License.dateCreated)
    .Select(group => group.OrderByDescending(item => item.nLicenceID));
person Servy    schedule 29.04.2013