2012-01-24 31 views
8

में मैं ItemNumber द्वारा मेरी LINQ क्वेरी समूह चाहते और Quantity के लिए कुल के साथ पूरे तालिका लौट आते हैं।लैम्ब्डा अभिव्यक्ति ग्रुप सी #

public IQueryable<WebsiteOrderStatus> GetOrderStatusByAccountNumberWithoutDeleted 
     (string accountNumber) 
{ 
    return db.WebsiteOrderStatus 
      .Where(x => x.AccountNumber == accountNumber && x.LastUpdatedStatus != 1); 
} 

और मेरे सबसे अच्छे परिणाम अब तक (हालांकि इस संकलन नहीं कर सकता):

public IQueryable<IGrouping<Int32?, WebsiteOrderStatus>> lol(string accountNumber) 
{ 
    db.WebsiteOrderStatus 
     .Where(x => x.AccountNumber == accountNumber && x.LastUpdatedStatus != 1) 
     .GroupBy(g => g.ItemNumber) 
     .Select(g => new 
        { 
         g.Key.ItemNumber, 
         Column1 = (Int32?)g.Sum(p => p.Quantity) 
        }); 
} 

संपादित करें:

Example: 
ItemNumber - ItemName - Quantity 
100   Item1  1 
150   Item2  2 
100   Item1  2 
200   Item3  1 
150   Item2  2 

Should be: 
ItemNumber - ItemName - Quantity 
100   Item1  3 
150   Item2  4 
200   Item3  1 

इस क्वेरी मैं समूह के लिए कोशिश कर रहा हूँ है

उत्तर हर किसी के लिए धन्यवाद, मैं यह सामना करना होगा। थीस अज्ञात प्रकार मेरी राय में काम करने के लिए बहुत कठिन हैं, इसलिए मुझे एक और समाधान मिला।

मैं एक और तरीका है, जो उपयोगकर्ताओं हुई वस्तुओं की मात्रा का योग बना दिया है और पहले एक वर्गीकृत किया।

public IQueryable<WebsiteOrderStatus> GetOrderStatusByAccountNumberWithoutDeleted(string accountNumber) 
{ 
    return db.WebsiteOrderStatus.Where(x => x.AccountNumber == accountNumber && x.LastUpdatedStatus != 1).GroupBy(x => x.ItemNumber).Select(grp => grp.First()); 
} 

public int GetQuantityOfUsersItem(string accountNumber, string itemNumber) 
{ 
    return db.WebsiteOrderStatus.Where(x => x.ItemNumber == itemNumber && x.AccountNumber == accountNumber).Sum(x => x.Quantity); 
} 
पेज पर

जहां मैं अपने gridview है मैंने किया:

var query = websiteOrderStatusRep.GetOrderStatusByAccountNumberWithoutDeleted(AppSession.CurrentLoginTicket.AccountNumber).Select(x => new { x.ItemName, x.ItemNumber, x.FormatName, x.Price, x.Status, x.Levering, Quantity = websiteOrderStatusRep.GetQuantityOfUsersItem(x.AccountNumber, x.ItemNumber)}); 
+1

सुनिश्चित नहीं हैं और क्या गलत है, लेकिन बहुत कम से कम, आप 'मेरा उत्तर तय दूसरे नमूने में 'वापसी' गायब हो रहा है। – Ani

+0

आपको संकलित त्रुटि क्या मिल रही है? –

+1

शायद वह जी.के को किसी ऑब्जेक्ट के रूप में पेश करने का प्रयास कर रहा है, जबकि यह सिर्फ int है। यदि वह परिणाम में आइटम का नाम चाहता है तो उसे इसे मुख्य ऑब्जेक्ट में भी स्टोर करना होगा (और चाबियों को एक ऑब्जेक्ट जो तुलनीय है) या इसे समूह एनम्बरेटर में पहली प्रविष्टि से पढ़ें। – Rup

उत्तर

10
public IQueryable<IGrouping<Int32?, WebsiteOrderStatus>> lol(string accountNumber) 
{ 
    db.WebsiteOrderStatus 
     .Where(x => x.AccountNumber == accountNumber && x.LastUpdatedStatus != 1) 
     .GroupBy(g => g.ItemNumber) 
     .Select(g => new 
        { 
         ItemNumber = g.Key, 
         ItemName = g.First().ItemName, 
         Count = g.Sum(item => item.Quantity) 
        }); 
} 
3

मुझे लगता है कि Select होना चाहिए:

.Select(g => new 
       { 
        ItemNumber = g.Key, 
        Column1 = (Int32?)g.Sum(p => p.Quantity) 
       }); 

नोट की पहली पंक्ति में परिवर्तन गुमनाम प्रकार ग्रुपिंग की कुंजी पहले से ही आइटम नंबर है।

5

आपकी क्वेरी के साथ मैं देख रहा हूँ केवल समस्याओं

  1. टिप्पणियों के अनुसार return बयान याद कर रहे हैं
  2. चयन बयान होना चाहिए:

-

.Select(g => new { 
     ItemNumber = g.Key, 
     Total = g.Sum(p => p.Quantity) 
    }); 

संपादित करें: यदि आप प्राप्त करना चाहते हैं, मान लीजिए कि ItemNumber और ITEMNAME, जिसके परिणामस्वरूप वस्तु में, आप उन क्षेत्रों

db.WebsiteOrderStatus 
    .Where(x => x.AccountNumber == accountNumber && x.LastUpdatedStatus != 1) 
    .GroupBy(g => new { g.ItemNumber, g.ItemName }) 
    .Select(g => new 
       { 
        ItemNumber = g.Key.ItemNumber, 
        ItemName = g.Key.ItemName, 
        Count = g.Sum(item => item.Quantity) 
       }); 
+0

ऐसा लगता है कि यह केवल आइटम नंबर और कुल लौटा रहा है। मैं जो चाहता हूं वह पूरी तालिका नामक कॉलम के साथ पूरी तालिका है, जिसमें कुल – KLIM8D

+0

@ KLIM8D के लिए कुल शामिल है - – Jamiec

+0

अद्यतन देखें, इसलिए परिणाम में जो भी ऑब्जेक्ट मैं प्राप्त करना चाहता हूं वह समूह में होना चाहिए। मेरे पास वास्तव में तालिका में 5 अन्य फ़ील्ड हैं, क्या ग्रुपबी में आवश्यक सभी फ़ील्ड के अलावा इस समूह को करने के अलावा एक बेहतर तरीका हो सकता है? – KLIM8D

7
public IQueryable<OrderStatus > lol(string accountNumber) 
{ 
    return db.WebsiteOrderStatus 
     .Where(x => x.AccountNumber == accountNumber && x.LastUpdatedStatus != 1) 
     .GroupBy(g => g.ItemNumber) 
     .Select(g => 
       new OrderStatus //This is your custom class, for binding only 
       { 
        ItemNumber = g.Key, 
        ItemName = g.First().ItemName, 
        Quantity = g.Sum(g => g.Quantity) 
       } 
     ); 
} 
+0

हम लगभग वहां हैं - कोई त्रुटि नहीं जब तक कि मैं बांधने की कोशिश नहीं कर रहा हूं एक ग्रिडव्यू के लिए मेरी पूछताछ। मुझे यह अपवाद मिल रहा है: System.NotSupportedException: क्वेरी प्रकार 'GWportal.BusinessLayer.Repository.WebsiteOrderStatus' का स्पष्ट निर्माण अनुमति नहीं है। – KLIM8D

+2

'संस्थाओं को प्रश्नों के बाहर बनाया जा सकता है और डेटाकॉन्टेक्स्ट का उपयोग कर डेटा स्टोर में डाला जा सकता है। फिर आप प्रश्नों का उपयोग करके उन्हें पुनर्प्राप्त कर सकते हैं। हालांकि, आप एक क्वेरी के हिस्से के रूप में संस्थाएं नहीं बना सकते हैं। 'इस मामले में आपको उस कक्षा के ऑब्जेक्ट पर' वेबसाइटऑर्डर स्टेटस 'को बाइंडिंग और मैप करने के लिए कस्टम क्लास बनाना होगा। –

2

पर भी समूह आप वापसी मान प्रकार के लिए गुमनाम प्रकार का उपयोग नहीं कर सकते हैं करना चाहिए। तो आप कोड को कभी संकलित नहीं करेंगे।

इसके अलावा अपने LINQ अभिव्यक्ति IQueryable < [गुमनाम प्रकार]> परिणाम प्रकार है।

मेरा मानना ​​है कि आप इस तरह से कुछ कर सकते हैं कि:

public IQueryable<OrderStatus> lol(string accountNumber) 
{ 
    db.WebsiteOrderStatus 
     .Where(order => order.AccountNumber == accountNumber && order.LastUpdatedStatus != 1) 
     .GroupBy(order => order.ItemNumber) 
     .Select(grouping => new OrderStatus //This is your custom class, for binding only 
        { 
         ItemNumber = grouping.Key, 
         ItemName = grouping.First().ItemName, 
         Quantity = grouping.Sum(order => order.Quantity) 
        }); 
} 

मैं `ve भी :)

+0

आप अज्ञात प्रकारों का उपयोग वापसी मूल्य के रूप में क्यों नहीं कर सकते हैं। – Jamiec

+1

विधि के हस्ताक्षर में आप इसे कैसे निर्दिष्ट करते हैं? –

+0

एमएसडीएन: आप एक अज्ञात प्रकार के रूप में एक फ़ील्ड, एक संपत्ति, एक घटना, या एक विधि के वापसी प्रकार घोषित नहीं कर सकते हैं। इसी तरह, आप एक विधि, संपत्ति, कन्स्ट्रक्टर, या इंडेक्सर का औपचारिक पैरामीटर घोषित नहीं कर सकते हैं। एक अज्ञात प्रकार, या एक संग्रह जिसमें अज्ञात प्रकार होते हैं, किसी विधि के लिए तर्क के रूप में, आप पैरामीटर को प्रकार ऑब्जेक्ट के रूप में घोषित कर सकते हैं। हालांकि, ऐसा करने से मजबूत टाइपिंग के उद्देश्य को हराया जाता है। यदि आपको क्वेरी परिणाम संग्रहीत करना होगा या विधि सीमा के बाहर उन्हें पास करना होगा, तो अज्ञात प्रकार के बजाय सामान्य नामित संरचना या कक्षा का उपयोग करने पर विचार करें। –

संबंधित मुद्दे