【发布时间】:2014-03-02 10:29:09
【问题描述】:
我正在使用 SQL Server 2012 Express、Entity Framework 6 和 ASP.NET MVC 5。
在 SQL Server 中,我有一个包含 40 万条记录的 pricelist 表。价目表结构如下:
|Id|Manufacturer|Name|Description|StockQuantity|PriceId|
我还有一个price 表:
|Id|Price|CurrencyId|
还有一个currency 表:
|Id|Name|Alias|Value|
Name 和 Description 列由 SQL Server 全文索引编制索引。
我需要从pricelist 获取20 条记录,其中Name 或Description 包含 搜索查询并将其作为XML 返回。而且我需要不到一秒钟的时间来获取它们,因为这是全局搜索服务的条件之一(它的请求超时为 1 秒,我无法更改)。这是结果 XML 的结构:
<items>
<item mfr="PC" Name="Laptop" Description="2.4GHz, etc." StockQuantity="500" P1="100" P2="200" P3="300" Cur="USD"/>
</items>
其中P1、P2 和P3 是不同订单数量的价格。
我正在使用此代码来获取记录:
using (var db = new DatabaseContainer()) {
db.Configuration.AutoDetectChangesEnabled = false;
db.Configuration.ValidateOnSaveEnabled = false;
db.Configuration.LazyLoadingEnabled = false;
var result =
(from pricelistRow in db.EFPricelist
where pricelistRow.Name.Contains(search) || pricelistRow.Description.Contains(search)
select new Result {
Manufacturer = pricelistRow.Manufacturer,
Name = pricelistRow.Name,
Description = pricelistRow.Description,
StockQuantity = pricelistRow.StockQuantity,
P1 = pricelistRow.EFPricelistRowPrice.Any() ? SqlFunctions.StringConvert(pricelistRow.EFPricelistRowPrice.Min(x => x.Price)) : "",
P2 = pricelistRow.EFPricelistRowPrice.Count() == 3 ? SqlFunctions.StringConvert(pricelistRow.EFPricelistRowPrice.OrderBy(x => x.Price).Skip(1).FirstOrDefault().Price) : "",
P3 = pricelistRow.EFPricelistRowPrice.Count() > 1 ? SqlFunctions.StringConvert(pricelistRow.EFPricelistRowPrice.Max(x => x.Price)) : "",
Cur = pricelistRow.EFPricelistRowPrice.Any() ? pricelistRow.EFPricelistRowPrice.FirstOrDefault().EFCurrency.Alias : ""
}).Take(20).ToList();
return new XmlResult(new Result {
Items = result
});
}
大约需要 2 秒。如何提高性能?
【问题讨论】:
标签: c# sql sql-server asp.net-mvc entity-framework