1

在C#中使用实体集合的查询功能,从SQL Server 2008中加载相关记录需要很长时间。有什么快速的方法吗?这是我使用的查询功能:

 public void SearchProducts()
    {
        //Filter by search string array(searchArray)
        List<string> prodId = new List<string>();

        foreach (string src in searchArray)
        {
            StoreProductCollection prod = new StoreProductCollection();
            prod.Query.Where(prod.Query.StptName.ToLower() == src.ToLower() && prod.Query.StptDeleted.IsNull());
            prod.Query.Select(prod.Query.StptName, prod.Query.StptPrice, prod.Query.StptImage, prod.Query.StptStoreProductID);
            //  prod.Query.es.Top = 4;
            prod.Query.Load();

            if (prod.Count > 0)
            {
                foreach (StoreProduct stpt in prod)
                {
                    if (!prodId.Contains(stpt.StptStoreProductID.ToString().Trim()))
                    {
                        prodId.Add(stpt.StptStoreProductID.ToString().Trim());
                        productObjectsList.Add(stpt);
                    }

                }
            }
         }
4

3 回答 3

0

首先,在 StptName 列上放置一个索引。

其次,如果您需要更好的性能,请在 SQL 中编写一个存储过程来进行查询,并将其映射到实体框架。

如果您需要解释如何执行上述任何操作,请告诉我。

如果您不想编写存储过程,可以进行更多的微优化:

  1. 将 src.ToLower() 写入临时变量,然后将 prod.Query.StptName.ToLower() 与它进行比较。
  2. 默认情况下,SQL Server 查询不区分大小写,因此请检查是否是这种情况,如果是,您可以完全摆脱 ToLower。您可以通过排序规则更改区分大小写。

编辑:
创建索引:
在 SQL Server Management Studio 中打开表设计器。
右键单击任意位置并选择索引/键。
单击添加。
在列下添加 StptName。
在 Is Unique 下指定 StptName 是否唯一。
在类型下选择“索引”。
就这样!

至于映射存储过程 - 这是一个很好的教程:
http
://www.robbagby.com/entity-framework/entity-framework-modeling-select-stored-procedures/ (您可以直接跳转到“选择存储中的映射”程序”部分)。

于 2012-07-17T08:51:25.833 回答
0

您每个searchArray项目都访问数据库一次,这是非常错误的。你可能会像这样获得更好的性能(没有办法测试它,试一试):

public void SearchProducts()
{
    //Filter by search string array(searchArray)
    List<string> prodId = new List<string>();
    StoreProductCollection prod = new StoreProductCollection();

    // Notice that your foreach() is gone

    // replace this
    // prod.Query.Where(prod.Query.StptName.ToLower() == src.ToLower() && prod.Query.StptDeleted.IsNull());
    // with this (or something similar: point is, you should call .Load() exactly once)
    prod.Query.where(prod.Query.StptDeleted.IsNull() && src.Any(srcArrayString => prod.Query.StptName.ToLower()==srcArrayString.ToLower());

    prod.Query.Select(prod.Query.StptName, prod.Query.StptPrice, prod.Query.StptImage, prod.Query.StptStoreProductID);
    //  prod.Query.es.Top = 4;
    prod.Query.Load();

    // ... rest of your code follows. 
}
于 2012-07-17T08:51:32.973 回答
0

鉴于List<string> searchArray包含降低的单词:

    public void SearchProducts()  
    {  
        //Filter by search string array(searchArray)  
        List<string> prodId = new List<string>();

        StoreProductCollection prod = new StoreProductCollection();  
        prod.Query.Where(searchArray.Contains(prod.Query.StptName.ToLower()) && prod.Query.StptDeleted.IsNull());  
        prod.Query.Select(prod.Query.StptName, prod.Query.StptPrice, prod.Query.StptImage, prod.Query.StptStoreProductID);  
        //  prod.Query.es.Top = 4;  
        prod.Query.Load();  

        if (prod.Count > 0)  
        {  
            foreach (StoreProduct stpt in prod)  
            {  
                if (!prodId.Contains(stpt.StptStoreProductID.ToString().Trim()))  
                {  
                    prodId.Add(stpt.StptStoreProductID.ToString().Trim());  
                    productObjectsList.Add(stpt);  
                }  

            }  
        }  
     }  

这样,您对所有单词只有一个查询。

于 2012-07-17T08:52:00.523 回答