2012-07-16 63 views
0

我有一个带有按钮和datagridview的winform。Linq查询优化以获得更快的结果

的情况是:

我有一个winform:

    using System; 
     using System.Collections.Generic; 
     using System.ComponentModel; 
     using System.Data; 
     using System.Drawing; 
     using System.Linq; 
     using System.Text; 
     using System.Windows.Forms; 

     namespace WindowsFormsApplication1 
     { 
      public partial class Form1 : Form 
      { 
       public Form1() 
       { 
        InitializeComponent(); 
        CreateItems(); 
       } 

       private List<Store> stores = new List<Store>(); 

       public void CreateItems() 
       { 

        Store newStore1 = new Store(); 
        newStore1.StoreName = "My Store 1"; 
        newStore1.City = "My City 1"; 
        newStore1.PlannedSales = 10; 
        newStore1.RealizedSales = 5; 
        newStore1.SalesDate = new DateTime(2012, 01, 12, 12, 30, 54, DateTimeKind.Unspecified); 

        Store newStore2 = new Store(); 
        newStore2.StoreName = "My Store 2"; 
        newStore2.City = "My City 2"; 
        newStore2.PlannedSales = 200000; 
        newStore2.RealizedSales = 250000; 
        newStore2.SalesDate = new DateTime(2012, 04, 12, 12, 30, 54, DateTimeKind.Unspecified); 

        Store newStore3 = new Store(); 
        newStore3.StoreName = "My Store 3"; 
        newStore3.City = "My City 3"; 
        newStore3.PlannedSales = 100000; 
        newStore3.RealizedSales = 10000; 
        newStore3.SalesDate = new DateTime(2012, 05, 12, 12, 30, 54, DateTimeKind.Unspecified); 

        Store newStore4 = new Store(); 
        newStore4.StoreName = "My Store 1"; 
        newStore4.City = "My City 1"; 
        newStore4.PlannedSales = 20; 
        newStore4.RealizedSales = 10; 
        newStore4.SalesDate = new DateTime(2012, 02, 12, 12, 30, 54, DateTimeKind.Unspecified); 


        Store newStore5 = new Store(); 
        newStore5.StoreName = "My Store 1"; 
        newStore5.City = "My City 1"; 
        newStore5.PlannedSales = 30; 
        newStore5.RealizedSales = 20; 
        newStore5.SalesDate = new DateTime(2012, 03, 12, 12, 30, 54, DateTimeKind.Unspecified); 



        stores.Add(newStore1); 
        stores.Add(newStore2); 
        stores.Add(newStore3); 
        stores.Add(newStore4); 
        stores.Add(newStore5); 
       } 

       private void btnQuery_Click(object sender, EventArgs e) 
       { 
        var query1 = stores.GroupBy(x => new 
        { 
         x.City, 
         x.StoreName, 
         x.SalesDate.Year, 
         x.SalesDate.Month 

        }).Select(group => new 
        { 
         Planned = group.Sum(x => x.PlannedSales), 
         Realised = group.Sum(x => x.RealizedSales), 
         Count = group.Count(), 
         City = group.Key.City, 
         StoreName = group.Key.StoreName, 
         Year = group.Key.Year, 
         Month = group.Key.Month 
        }).OrderBy(x => x.Year).ThenBy(x => x.Month).Where(x => x.StoreName.Equals("My Store 1")); 

        List<Store> total = new List<Store>(); 

        foreach (var value in query1) 
        { 
         Store newStore = new Store() 
         { 
          MonthYear = value.Month.ToString() + " - " + value.Year.ToString(), 
          RealizedSales = value.Realised, 
          PlannedSales = value.Planned 

         }; 
         total.Add(newStore); 
        }; 


        var query2 = total.Select((s, i) => new 
        { 
         MonthYear = s.MonthYear, 
         RealizedSales = s.RealizedSales + total.Take(i).Sum(sa => sa.RealizedSales), 
         PlannedSales = s.PlannedSales + total.Take(i).Sum(sa => sa.PlannedSales) 
        }); 

        List<Store> totalFinal = new List<Store>(); 


        foreach (var value in query2) 
        { 
         Store newStore = new Store() 
         { 
          MonthYear = value.MonthYear, 
          RealizedSales = value.RealizedSales, 
          PlannedSales = value.PlannedSales 
         }; 
         totalFinal.Add(newStore); 
        }; 


        dataGridView1.DataSource = totalFinal; 

       } 
      } 

      public class Store 
      { 
       public string StoreName { get; set; } 
       public string City { get; set; } 

       public int PlannedSales { get; set; } 
       public int RealizedSales { get; set; } 

       public DateTime SalesDate { get; set; } 

       public string MonthYear { get; set; } 

      } 
     } 

当窗体被实例化,方法CreateItems被调用。此方法将填充列表与一些演示存储数据。

当从表单按钮被按下,比列表存储以这样的方式,将来自我列表存储返回所有PlannedSalesRealizedSalesMonthYear查询使用LINQ凡STORENAME =我的店1

查询结果的一个例子是在这里:http://i49.tinypic.com/vz1c6.jpg

任何想法如何优化此查询,使其更简单,但得到相同的结果?

基本上我只需要返回所有计划和已实现的每月销售额,仅针对特定商店名称!

谢谢!

+0

在哪里以及它是如何缺乏,你认为它需要优化? – Mayank 2012-07-16 09:48:29

+0

我在silverlight sharepoint webpart中使用它,查询列表中的很多项目时很慢,而且您的数据量很大。例如其他一些查询可以很好地工作,除了这个和另一个非常相似的查询之外。 – 2012-07-16 09:56:49

回答

0

因为这应该是一样容易:

var totalPlanned = 0; 
var totalRealized = 0; 
var result = stores.Where(s => s.StoreName.Equals("My Store 1")) 
        .Select(s => { 
         totalPlanned += s.PlannedSales; 
         totalRealized += s.RealizedSales; 
         return new Store(){ 
          MonthYear = s.SalesDate.ToString("MM - yyyy"), 
          PlannedSales = totalPlanned, 
          RealizedSales = totalRealized 

         }; 
        }); 

活生生的例子显示,显示同样的结果旁边原来的这个新代码:http://rextester.com/PAF27531

+0

这适用于演示数据,但如果数据未按日期排序或者存在多个具有相同城市,名称和日期的商店,则不会得到相同的结果。 – 2012-07-16 15:16:08

-1
from s in stores 
where s.StoreName == "My Store 1" 
group s by new { s.StoreName, s.SalesDate.Year, s.SalesDate.Month } into g 
select new 
{ 
g.Key.StoreName, 
MonthYear = g.Key.Year.ToString() + " - " + g.Key.Month.ToString(), 
Planned = g.Sum(st => st.PlannedSales), 
Realized = g.Sum(st => st.RealizedSales) 
} 
+0

这给了OP的原始结果一个完全不同的结果。 http://rextester.com/XQOO40579 – Jamiec 2012-07-16 10:08:35