添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

优化和加速非常慢的Linq/SQL代码

0 人关注

我有以下的C#方法,我用它来预加载一个股票的数据表。 虽然它工作得很好,但现在我的表中有很多行,它的加载速度可能非常非常慢。

谁能推荐一个更好、更快的方法来做这件事? (最好是去掉 "foreach "代码,因为这是最慢的部分!)。

public static DataTable GetProducts()
    DataTable table = new DataTable();
    using (DataClassesDataContext data = new DataClassesDataContext(cDbConnection.GetConnectionString()))
        var query = (from p in data.Products
                     where p.Deleted == false
                     join s in data.ProductStocks on p.ProductID equals s.ProductID
                     group s by p into g
                     select new { g });
        table.Columns.Add("Barcode", typeof(string));
        table.Columns.Add("Stock Code", typeof(string));
        table.Columns.Add("Description", typeof(string));
        table.Columns.Add("Price", typeof(string));
        table.Columns.Add("Tax", typeof(string));
        table.Columns.Add("Stock", typeof(string));
        table.Columns.Add("Service Item", typeof(bool));
        table.Columns.Add("Deduct Stock", typeof(bool));
        if (query != null)
            foreach (var item in query)
                    decimal? Tax = 0;
                    if (item.g.Key.ProductTax != null)
                        Tax = Common.Utilities.IsValueValidDecimal(item.g.Key.ProductTax.TaxRate, 0);   // Tax
                        Tax = 0;
                    bool DeductStock = !Convert.ToBoolean(item.g.Key.ServiceItem);
                    string[] row = new string[] 
                        item.g.Key.EANCode.ToString(),       // Barcode
                        item.g.Key.OurStockCode.ToString(),  // Product Code
                        item.g.Key.Description.ToString(),   // desc
                        GetGUIDisplayPrice(item.g.Key.RetailPrice, item.g.Key.RetailPriceExVAT),  // cost
                        Tax.ToString(),                         // Tax   
                        item.g.Sum(s => s.QtyOnHand).ToString(), // Stock
                        item.g.Key.ServiceItem.ToString(),   // Service Item (non-stock)
                        DeductStock.ToString()                  // if not a service item, the its a stocked item so deduct!
                    table.Rows.Add(row);
                catch (Exception ex)
        }//ENDIF NULL
    }//END USING
    return table;
    
10 个评论
你的分析显示了什么?在这段代码中,数据库的速度很慢吗?
Common.Utilities.IsValueValidDecimal的代码是什么?
请在发帖前多花点心思在格式化你的代码上--看看你要发的问题,问问如果你要回答的话,它的格式是否是你想看到的样子。
var query = (query).toList().这将把所有的数据加载到查询变量中,我认为这将提高你进行迭代时的性能。
这是linq to sql还是实体框架?
谢谢你的回答,我基本上是想看看我是否可以用Linq代替Foreach,这样我就可以在服务器上进行所有的计算,而不是对表中的每一条记录进行计算。 我的sql/linq知识有限,这基本上是根据我在以前的问题中得到的建议和试错而写出来的。
Jon Skeet - 你建议我如何格式化代码?我认为我的代码对这个问题来说是完美的格式!你的建议是什么? 你的建议将是很好的?
Fredou - 这个函数检查一个有效的int(即不是null),代码是linq to sql。
理查德--这是我不知道的事情,也是我以前从未做过的事情? (该用谷歌了!)
@ViswasMenon: var query = (query).toList()并不能加快任何速度。它可能会减慢进程,因为你想把结果流化,而不是完整地获取它。@Belliez:你为什么要使用一个可忽略的小数?Tax.ToString()会在null时失败。另外, select new { g } 应该替换为 select g 。试着把 item.g.Sum(s => s.QtyOnHand).ToString() 移到查询中,这样它就可以在服务器端计算。
c#
sql
sql-server
linq
sql-server-2008
Belliez
Belliez
发布于 2014-11-18
2 个回答
Remus Rusanu
Remus Rusanu
发布于 2016-11-27
0 人赞同
from p in data.Products
                 where p.Deleted == false
                 join s in data.ProductStocks on p.ProductID equals s.ProductID
                 group s by p into g
                 select new { g }

产品和ProductStocks表的模式是什么?你有哪些索引?首先阅读《如何分析SQL Server的性能》。

有一些事情是非常突出的。

  • 你在客户端上从服务器上获取所有的数据。不要。在后端进行处理。
  • 使用一个Deleted bit字段是(性能)灾难的秘诀。你可以把它添加到一个聚类索引的最左边的键,充其量是可疑的结果。通过分区可以有所帮助,但帮助不大。没有银弹。试着消除这个要求。删除被删除的行。
  •