سؤال

أحاول حل مشكلة "Group-Wise Max" في LinQ. للبدء، لدي قاعدة بيانات على غرار استخدام إطار الكيان بالهيكل التالي:

Customer:
---------
CustomerID : Int32
Name : String

Order:
-------
OrderID : Int32
CustomerID : Int32
Total : Decimal

هذا يعطيني الملاحة من عميل إلى طلباتها وستيب للمالك.

أحاول إنشاء استعلام LINQ الذي يسمح لي بالعثور على طلبات العملاء من أعلى 10 في قاعدة البيانات. حالة بسيطة كانت سهلة جدا للتوصل إلى:

var q = (
    from order in _data.Orders  // ObjectQuery<Order>
    orderby order.Amount descending select order
).Take(10);

ومع ذلك، أود فقط إظهار العملاء الفريدين فقط في هذه القائمة. ما زلت جديدا بعض الشيء إلى LINQ، لكن هذا هو ما أتيح به:

var q = (
    from order in _data.Orders  // ObjectQuery<Order>
    group order by order.Customer into o
    select new {
        Name = o.Key.Name,
        Amount = o.FirstOrDefault().Amount
    }
).OrderByDescending(o => o.Amount).Take(10);

يبدو أن هذا يعمل، لكنني لست متأكدا مما إذا كان هذا هو أفضل نهج. على وجه التحديد، أتساءل عن أداء هذا الاستعلام مقابل قاعدة بيانات كبيرة جدا. أيضا، باستخدام FirstOrDefault الطريقة من استدعاء المجموعة تبدو غريبة قليلا ...

هل يمكن لأي شخص أن يقدم نهجا أفضل، أو بعض الضمان أن هذا هو الصحيح؟

هل كانت مفيدة؟

المحلول

يمكنك القيام به:

var q = (
    from order in _data.Orders  // ObjectQuery<Order>
    orderby order.Amount descending select order
).Distinct().Take(10);

وأود أن ننظر عادة إلى SQL المولدة، ونرى ما هو الأفضل.

نصائح أخرى

Customer
.Select(c=>new {Order= c.Orders.OrderByDescending(o=>o.Total).First()})
.OrderByDescending(o=>o.Total)
.Take(10);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top