मैं कॉलम के योग और कितने हैं, के आधार पर औसत की गणना करने की कोशिश कर रहा हूं।

प्रत्येक फिल्म में एक मूवीरेटिंग हो सकती है, मैं मूवीरेटिंग को एक साथ जोड़ने की कोशिश कर रहा हूं और फिर मूवी के लिए औसत रेटिंग प्राप्त करने के लिए उन्हें रेटिंग की मात्रा से विभाजित करने की कोशिश कर रहा हूं।

(reviews.Where(w => w.MovieID == m.MovieID).Sum(o => o.MovieRating)) / reviews.Where(z => z.MovieID == m.MovieID).Count();

लेकिन समस्या यह है कि अगर गिनती 0 है। मैं इसके बारे में क्या कर सकता हूं?

3
sander 24 मई 2018, 15:19

6 जवाब

सबसे बढ़िया उत्तर

Average फ़ंक्शन में निर्मित LINQs का उपयोग कैसे करें?

reviews
    .Where(z => z.MovieID == m.MovieID)
    .Select(z => z.MovieRating)
    .DefaultIfEmpty(0)
    .Average()

सर्वर पर पूरी तरह से क्वेरी चलाने के लिए (मेरे अनुमान के आधार पर, आपके डेटाबेस सर्वर पर):

reviews
    .Where(z => z.MovieID == m.MovieID)
    .Average(z => (decimal?)z.MovieRating) ?? 0
7
paul 28 मई 2018, 14:25

आप इस्तेमाल कर सकते हैं

var ratingList = reviews
   .Where(z => z.MovieID == m.MovieID)
   .Select(z => z.MovieRating)
   .ToList();
if(ratingList.Count > 0)
{
   double result = ratingList.Sum() / ratingList.Count;
}
5
Tim Schmelter 24 मई 2018, 15:28
double? score = reviews
   .Where(w => w.MovieID == m.MovieID)
   .Average(w => (double?) w.MovieRating)
   // ?? 0   // optional: pick a default when Average returns null
   ;
1
bommelding 28 मई 2018, 09:29

अगर नीचे की तरह शर्त है तो बस इनलाइन का उपयोग करें:

var avr = (from a1 in reviews
           where a1.MovieID == m.MovieID
           group a1 by a1.MovieID into g
           select new
           {
               avr = g.count() == 0 ? 0 : g.sum(r => r.MovieRating) / g.count()
           }).FirstOrDefault().avr;
0
Hasan Gholamali 24 मई 2018, 15:50

निश्चित नहीं है कि LINQ के उपयोग पर कोई विशेष जोर दिया गया है, लेकिन मैं इसे एकाधिक LINQ के बजाय for/foreach लूप में रखना पसंद करूंगा। अन्यथा नीचे काम करेगा?

var matchingReviews = reviews.Where(w => w.MovieID == m.MovieID);
int matchingReviewCount = matchingReviews.Count();
if (matchingReviewCount  > 0)
{
    matchingReviews.Sum(o => o.MovieRating) / matchingReviewCount;
}
else
{
    //return default value?
}
-1
touchofevil 24 मई 2018, 15:45

मैं एक ही प्रश्न बनाना चाहता था (क्योंकि शायद हम एक डीबी पर काम कर रहे हैं, और प्रत्येक क्वेरी की लागत है "सिर्फ इसलिए कि यह एक क्वेरी है") और सभी गणना एसक्यूएल-साइड करें, ताकि मुझे एक पंक्ति वापस मिल जाए ( क्योंकि अगर 1000 समीक्षाएं हैं, तो मुझे वास्तव में उन सभी को डाउनलोड करने की आवश्यकता नहीं है... मुझे उनके MovieRating और उनकी गिनती का योग चाहिए)।

// Based on https://stackoverflow.com/a/45144198/613130
var result = reviews
    .Where(x => x.MovieID == m.MovieID)
    .GroupBy(x => 1)
    .Select(x => ((double?)x.Sum(y => y.MovieRating)) / x.Count())
    .FirstOrDefault() ?? -1.0;

अगर MovieID के लिए कोई समीक्षाएं नहीं हैं, तो result -1.0 होगा। कास्ट के उपयोग पर ध्यान दें क्योंकि अन्यथा हमारे पास एक पूर्णांक विभाजन होगा (यदि MovieRating एक पूर्णांक है)।

ध्यान दें कि यदि कोई पंक्ति नहीं मिलती है तो कोई विभाजन नहीं होगा (क्योंकि कोई Group नहीं होगा)

SQL डेटाबेस पर समतुल्य क्वेरी होनी चाहिए

SELECT CAST(SUM(x.MovieRating) AS FLOAT) / COUNT(*) 
    FROM Reviews x 
    WHERE x.MovieID = @MovieID 
    GROUP BY 1

लेकिन सच में ईएफ ने इसे और अधिक जटिल तरीके से अनुवादित किया :-) (ईएफ 6.2.0 पर परीक्षण):

SELECT 
    CAST( [GroupBy1].[A1] AS float) /  CAST( [GroupBy1].[A2] AS float) AS [C1]
FROM ( SELECT 
    [Filter1].[K1] AS [K1], 
    SUM([Filter1].[A1]) AS [A1], 
    COUNT([Filter1].[A2]) AS [A2]
    FROM ( SELECT 
        1 AS [K1], 
        [Extent1].[MovieRating] AS [A1], 
        1 AS [A2]
        FROM #Reviews AS [Extent1]
        WHERE [Extent1].[MovieId] = @p__linq__0
    )  AS [Filter1]
    GROUP BY [K1]
)  AS [GroupBy1]
-1
xanatos 24 मई 2018, 16:03