2012-07-04 15 views
5

मेरे पास एक ऐसा फ़ंक्शन है जो डेटाबेस से डेटा प्राप्त करने के लिए लिंक का उपयोग करता है और फिर मैं उस फ़ंक्शन को अन्य व्यक्तिगत गुणों का उपयोग करके सभी व्यक्तिगत गुणों का उपयोग करने के लिए कॉल करता हूं। प्रत्येक व्यक्तिगत संपत्ति पर। मैं सोच रहा था कि प्रत्येक व्यक्तिगत संपत्ति पर .Sum() को कॉल करने के बजाए सभी गुणों को एक साथ करने का एक प्रभावी तरीका है या नहीं। मुझे लगता है कि जिस तरह से मैं अभी कर रहा हूं, बहुत धीमा है (हालांकि अनचाहे)।एकाधिक गुणों पर कॉल करने के लिए कुशल तरीका।

public OminitureStats GetAvgOmnitureData(int? fnsId, int dateRange) 
    { 
     IQueryable<OminitureStats> query = GetOmnitureDataAsQueryable(fnsId, dateRange); 

     int pageViews = query.Sum(q => q.PageViews); 
     int monthlyUniqueVisitors = query.Sum(q => q.MonthlyUniqueVisitors); 
     int visits = query.Sum(q => q.Visits); 
     double pagesPerVisit = (double)query.Sum(q => q.PagesPerVisit); 
     double bounceRate = (double)query.Sum(q => q.BounceRate); 

     return new OminitureStats(pageViews, monthlyUniqueVisitors, visits, bounceRate, pagesPerVisit); 
    } 

संपादित

private IQueryable<OminitureStats> GetOmnitureDataAsQueryable(int? fnsId, int dateRange) 
    { 
     var yesterday = DateTime.Today.AddDays(-1); 
     var nDays = yesterday.AddDays(-dateRange); 

     if (fnsId.HasValue) 
     { 
      IQueryable<OminitureStats> query = from o in lhDB.omniture_stats 
               where o.fns_id == fnsId 
                && o.date <= yesterday 
                && o.date > nDays 
               select new OminitureStats ( 
                o.page_views.GetValueOrDefault(), 
                o.monthly_unique.GetValueOrDefault(), 
                o.visits.GetValueOrDefault(), 
                (double)o.bounce_rate.GetValueOrDefault() 
               ); 
      return query; 
     } 
     return null; 
    } 

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

public class OminitureStats 
    { 
     public OminitureStats(int PageViews, int MonthlyUniqueVisitors, int Visits, double BounceRate) 
     { 
      this.PageViews = PageViews; 
      this.MonthlyUniqueVisitors = MonthlyUniqueVisitors; 
      this.Visits = Visits; 
      this.BounceRate = BounceRate; 
      this.PagesPerVisit = Math.Round((double)(PageViews/Visits), 1); 
     } 

     public OminitureStats(int PageViews, int MonthlyUniqueVisitors, int Visits, double BounceRate, double PagesPerVisit) 
     { 
      this.PageViews = PageViews; 
      this.MonthlyUniqueVisitors = MonthlyUniqueVisitors; 
      this.Visits = Visits; 
      this.BounceRate = BounceRate; 
      this.PagesPerVisit = PagesPerVisit; 
     } 

     public int PageViews { get; set; } 
     public int MonthlyUniqueVisitors { get; set; } 
     public int Visits { get; set; } 
     public double PagesPerVisit { get; set; } 
     public double BounceRate { get; set; } 
    } 

उत्तर

6

IIRC आप एक ही बार में सभी राशियों कर सकते हैं (जब तक क्वेरी एसक्यूएल करने के लिए अनुवाद किया है) के साथ

var sums = query.GroupBy(q => 1) 
       .Select(g => new 
       { 
        PageViews = g.Sum(q => q.PageViews), 
        Visits = g.Sum(q => q.Visits), 
        // etc etc 
       }) 
       .Single(); 

यह आपको एक ऑब्जेक्ट देगा जिसमें सभी रकम अलग-अलग गुणों के रूप में होंगी।

+0

धन्यवाद जॉन। लेकिन मुझे 'var sums ...' पर 'NotSupportedException' नहीं मिल रहा है। लेकिन इसका आपके समाधान से कोई लेना-देना नहीं है। क्योंकि मैंने जिस तरह से किया था, उसका परीक्षण किया और यह अभी भी इस अपवाद को फेंक देगा। क्या इसका 'IQueryable ' भाग के साथ कुछ लेना देना है? – SherCoder

+0

और यह भी आपके समाधान के तरीके से अलग कैसे है। मुझे अभी भी प्रत्येक व्यक्तिगत गुणों पर .Sum() को कॉल करना होगा। धन्यवाद – SherCoder

+0

@ शेरकोडर: अपवाद के बारे में, आपको हमें यह बताना होगा कि आप किस प्रकार के 'IQueryable' के साथ काम कर रहे हैं। यह कैसे बेहतर है: सभी रकम एक ही अभिव्यक्ति वृक्ष के हिस्से के रूप में व्यक्त की जाती हैं, इसलिए SQL अनुवाद परत उन्हें केवल एक क्वेरी में खींच सकती है। – Jon

0

मुझे पता चला कि यह NotSupportedException क्यों फेंक रहा था। मैंने सीखा कि Linq to Entity पैरामीटर के साथ रचनाकारों का समर्थन नहीं करता है, इसलिए रचनाकारों को हटा दिया और मेरी क्वेरी में बदलाव किए। मैं एक नौसिखिया सी # प्रोग्रामर हूं, इसलिए मुझे बताएं कि क्या मेरा समाधान सुधार सकता है, लेकिन अभी के रूप में यह ठीक काम कर रहा है।

public class OminitureStats 
{ 
    public int PageViews { get; set; } 
    public int MonthlyUniqueVisitors { get; set; } 
    public int Visits { get; set; } 
    public double PagesPerVisit { get; set; } 
    public double BounceRate { get; set; } 
} 


private IQueryable<OminitureStats> GetOmnitureDataAsQueryable(int? fnsId, int dateRange) 
{ 
    var yesterday = DateTime.Today.AddDays(-1); 
    var nDays = yesterday.AddDays(-dateRange); 

    if (fnsId.HasValue) 
    { 
     IQueryable<OminitureStats> query = from o in lhDB.omniture_stats 
              where o.fns_id == fnsId 
               && o.date <= yesterday 
               && o.date > nDays 
              select new OminitureStats() { 
               o.page_views.GetValueOrDefault(), 
               o.monthly_unique.GetValueOrDefault(), 
               o.visits.GetValueOrDefault(), 
               (double)o.bounce_rate.GetValueOrDefault() 
              }; 
     return query; 
    } 
    return null; 
} 
संबंधित मुद्दे