LINQ

2011-08-31 11 views
8

में एक से अधिक कुल कॉलम लौटें मैं LINQ में निम्नलिखित एसक्यूएल अनुवाद करना चाहते हैं:LINQ

SELECT 
    (Select count(BidID)) as TotalBidNum, 
    (Select sum(Amount)) as TotalBidVal 
FROM Bids 

मैं इस की कोशिश की है:

from b in _dataContext.Bids 
select new { TotalBidVal = b.Sum(p => p.Amount), TotalBidNum = b.Count(p => p.BidId) } 

लेकिन एक त्रुटि "बोलियां प्राप्त एक शामिल नहीं है "Sum" के लिए परिभाषा और "बिड्स" प्रकार के पहले तर्क को स्वीकार करने वाला कोई एक्सटेंशन विधि "Sum" पाया जा सकता है।

मैं LINQ में यह कैसे कर सकता हूं?

धन्यवाद

समापन:

अंतिम जवाब था:

var ctx = _dataContext.Bids; 

var itemsBid = (from b in _dataContext.Bids 
       select new { TotalBidVal = ctx.Sum(p => p.Amount), TotalBidNum = ctx.Count() }).First(); 

उत्तर

6

आप इस बाहर की कोशिश कर सकते। परिवर्तनीय बी एक इकाई है (प्रत्येक पुनरावृत्ति के लिए) जबकि सीटीएक्स एक इकाई है जिसमें आपके इच्छित एक्सटेंशन विधियां हैं।

var ctx = _dataContext.Bids; 

var result = ctx.Select(x => new {TotalBidVal = ctx.Sum(p => p.Amount),TotalBidNum = ctx.Count(p => p.BidId)}).First(); 
+0

का उपयोग कर त्रुटि का समाधान (हालांकि यह एक अनावश्यक कदम की तरह लगता है था कि द्वारा समानांतरवाद से benfit सकता है - क्यों है इसकी आवश्यकता है?)। मेरी गणना के साथ एक समस्या थी (पी => पी। बिडआईडी) - एक त्रुटि है कि पी। बिडआईड बुलियन नहीं था। मैंने इसे गणना() के साथ बदल दिया और अब क्वेरी सही राशि देता है और गिनती है लेकिन एक पंक्ति के रूप में नहीं। एक ही पंक्ति में और अधिक - मैं बोलियां तालिका में पंक्तियों के रूप में कई बार मानता हूं। मैं अपनी मूल SQL क्वेरी में एक पंक्ति कैसे वापस कर सकता हूं? – BKahuna

+0

@BKahuna आपकी क्वेरी कहती है "बी से _dataContext.Bids" में एक पुनरावृत्ति है। और आपको एक परिणाम नहीं मिलेगा भले ही आप केवल योग और गणना करने की कोशिश कर रहे हों। आप पहले() को कॉल करके लैम्ब्डा अभिव्यक्ति को समाप्त कर सकते हैं। जो आपको केवल एक परिणाम देगा जैसा मैंने किया है। – scartag

+0

@BKahuna कृपया मेरे उत्तर को अंत तक स्क्रॉल करें और अंतिम कॉल देखें। मैं पहली() विधि को कॉल करता हूं जो सुनिश्चित करेगा कि मुझे केवल एक पंक्ति वापस मिल जाएगी (एसक्यूएल जेनरेट किया गया है शीर्ष (1)) – scartag

1

यहाँ scartag के समाधान के लिए एक विकल्प है:

(from b in _dataContext.Bids.Take(1) 
select new 
{ 
    TotalBidVal = _dataContext.Bids.Sum(p => p.Amount), 
    TotalBidNum = _dataContext.Bids.Count() 
}).Single(); 

वहाँ कोई वास्तविक कारण आप नहीं कर सकते हालांकि सिर्फ इतना कहना:

var result = new 
{ 
    TotalBidVal = _dataContext.Bids.Sum(p => p.Amount), 
    TotalBidNum = _dataContext.Bids.Count() 
}; 

यह दो बार डेटाबेस मारता है, लेकिन इसकी बहुत पठनीय

+0

यह सही उत्तर भी देता है - धन्यवाद! – BKahuna

+0

मैंने एक और व्यावहारिक समाधान – saus

17

आप GroupBy का उपयोग करके इस प्रश्न को लिख सकते हैं।

var itemsBid = db.Bids 
        .GroupBy(i => 1) 
        .Select(g => new 
        { 
          TotalBidVal = g.Sum(item => item.Amount), 
          TotalBidNum = g.Count(item => item.BidId) 
        }); 
+1

के साथ संपादित किया है जो वास्तव में मुझे चाहिए (हालांकि सादे पुराने लिनक में, कोई linq2SQL या EF नहीं)। – jahu

+0

सरल। मुझें यह पसंद है। – Oak

+0

यह आसान है लेकिन चाल है। वैसे, मैं ऑपरेटर के उद्देश्य को जानना चाहता हूं ".GroupBy (i => 1)"। हमें इसकी आवश्यकता क्यों है? –

0

आप इसे Aggregate Clause का उपयोग कर कर सकता है: लैम्ब्डा अभिव्यक्ति इस प्रकार है।

Aggregate t In _dataContext.Bids 
Into TotalBidNum = Count(BidID), 
    TotalBidVal = Sum(Amount) 

आप उपयोग कर रहे हैं FX4 + या FX2 के लिए एक विस्तार dll, आप भी

Aggregate t In _dataContext.Bids.AsParallel 
संबंधित मुद्दे

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