【问题标题】:Linq Query Optimization for faster resultsLinq 查询优化以获得更快的结果
【发布时间】:2012-07-16 22:38:35
【问题描述】:

我有一个带有按钮和 datagridview 的 winform。

场景是:

我有一个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 被调用。此方法将使用一些演示 Store 数据填充 List。

当按下表单中的按钮时,使用 Linq 查询 List stores,返回所有 PlannedSales 和 RealizedSales strong> 每 MonthYear 来自我的 List stores 其中 StoreName = My Store 1

查询结果示例如下:http://i49.tinypic.com/vz1c6.jpg

知道如何优化此查询以使其更简单但得到相同的结果吗?

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

谢谢!

【问题讨论】:

  • 您认为它需要优化的地方和原因是什么?
  • 我在 silverlight sharepoint webpart 中使用它,并且在从列表中查询大量项目并且您的数字很大时非常慢。例如,除了这个和另一个非常相似的查询之外,其他一些查询也可以正常工作。

标签: c# linq


【解决方案1】:

这应该很简单:

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

【讨论】:

  • 这适用于演示数据,但如果数据不是按日期排序或有多个商店具有相同的城市、名称和日期,则不会得到相同的结果。跨度>
【解决方案2】:
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)
}

【讨论】:

猜你喜欢
  • 2020-04-25
  • 2021-12-06
  • 2022-09-30
  • 1970-01-01
  • 2017-02-09
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 2017-11-15
相关资源
最近更新 更多