2017-03-15 44 views
0

我是新來的asp.net mvc5。如何提高在ASP.NET MVC中從SQL Server數據庫獲取數據的速度(複製)

我有一個模型Shippingdbo.Shippings.sql如下所示:

CREATE TABLE [dbo].[Shippings] 
(
    [Id]    INT    IDENTITY (1, 1) NOT NULL, 
    [TrackingNumber] NVARCHAR (MAX) NOT NULL, 
    [FromCompany]  NVARCHAR (MAX) NULL, 
    [FromContactName] NVARCHAR (MAX) NULL, 
    [From]    NVARCHAR (MAX) NOT NULL, 
    [FromCity]   NVARCHAR (MAX) NOT NULL, 
    [FromState]   NVARCHAR (MAX) NOT NULL, 
    [FromZipCode]  NVARCHAR (MAX) NOT NULL, 
    [FromCountry]  NVARCHAR (MAX) NOT NULL, 
    [FromPhoneNumber] NVARCHAR (MAX) NULL, 
    [FromFaxNumber]  NVARCHAR (MAX) NULL, 
    [Commodity]   NVARCHAR (MAX) NOT NULL, 
    [OrderDateTime]  DATETIME  NOT NULL, 
    [OrderByName]  NVARCHAR (MAX) NOT NULL, 
    [PickUpDateTime] DATETIME  NOT NULL, 
    [PickUpRefNum]  NVARCHAR (MAX) NOT NULL, 
    [DestCompany]  NVARCHAR (MAX) NULL, 
    [DestContactName] NVARCHAR (MAX) NULL, 
    [Destination]  NVARCHAR (MAX) NOT NULL, 
    [DestCity]   NVARCHAR (MAX) NOT NULL, 
    [DestState]   NVARCHAR (MAX) NOT NULL, 
    [DestZipCode]  NVARCHAR (MAX) NOT NULL, 
    [DestCountry]  NVARCHAR (MAX) NOT NULL, 
    [DestPhoneNumber] NVARCHAR (MAX) NULL, 
    [DestFaxNumber]  NVARCHAR (MAX) NULL, 
    [DeliveryDateTime] DATETIME  NOT NULL, 
    [Price]    FLOAT (53)  NOT NULL, 
    [Category]   NVARCHAR (MAX) NOT NULL, 
    [FreightClass]  INT    NOT NULL, 
    [Pkgs]    INT    NOT NULL, 
    [Weight]   REAL   NOT NULL, 
    [Length]   REAL   NOT NULL, 
    [Width]    REAL   NOT NULL, 
    [Height]   REAL   NOT NULL, 
    [IsDelivered]  BIT    NOT NULL, 
    [ApplicationUserId] NVARCHAR (128) NOT NULL, 
    [AcceptOffer]  BIT    DEFAULT ((0)) NOT NULL, 
    [TruckerId]   NVARCHAR (MAX) NULL, 
    [Description]  NVARCHAR (MAX) NULL, 
    [FileName]   NVARCHAR (255) NULL, 
    [ContentType]  NVARCHAR (100) NULL, 
    [Content]   VARBINARY (MAX) NULL, 

    CONSTRAINT [PK_dbo.Shippings] 
     PRIMARY KEY CLUSTERED ([Id] ASC), 
    CONSTRAINT [FK_dbo.Shippings_dbo.AspNetUsers_ApplicationUserId] 
     FOREIGN KEY ([ApplicationUserId]) 
      REFERENCES [dbo].[AspNetUsers] ([Id]) ON DELETE CASCADE 
); 
GO 

CREATE NONCLUSTERED INDEX [IX_ApplicationUserId] 
    ON [dbo].[Shippings]([ApplicationUserId] ASC); 

而且我的第一頁必須表明,並非所有售出運送(if shipping.truckerId == null意味着尚未出售)

在我ShippingController我有如下:

// GET: Shipping 
    public ActionResult Index(string sortOrder, string currentFilter, string searchString, int? page) 
    { 
     //below is sorting 
     ViewBag.CurrentSort = sortOrder; 
     ViewBag.FromSortParm = String.IsNullOrEmpty(sortOrder) ? "from_desc" : ""; 
     ViewBag.DestSortParm = sortOrder == "Destination" ? "dest_desc" : "Destination"; 

     if (searchString != null) 
     { 
      page = 1; 
     } 
     else 
     { 
      searchString = currentFilter; 
     } 

     ViewBag.CurrentFilter = searchString; 

     //below is searching state and zipcode 
     var shippings = from s in db.Shippings 
         where s.TruckerId == null 
         select s; 

     if (!String.IsNullOrEmpty(searchString)) 
     { 
      shippings = shippings.Where(s => s.FromState.Contains(searchString)//from state 
            || s.DestState.Contains(searchString)//dest state 
            || s.FromZipCode.Contains(searchString)//from zipcode 
            || s.DestZipCode.Contains(searchString));//dest zipcode 
     } 

     switch (sortOrder) 
     { 
      case "from_desc": 
       shippings = shippings.OrderByDescending(s => s.From); 
       break; 
      case "Destination": 
       shippings = shippings.OrderBy(s => s.Destination); //not working 
       break; 
      case "dest_desc": 
       shippings = shippings.OrderByDescending(s => s.Destination); //not working 
       break; 
      default: 
       shippings = shippings.OrderByDescending(s => s.OrderDateTime); 
       break; 
     } 

     int pageSize = 10; 
     int pageNumber = (page ?? 1); 
     return View(shippings.ToPagedList(pageNumber, pageSize)); 
     //return View(shippings.ToList()); 

    } 

我想:

var shippings = from s in db.Shippings 
       where s.TruckerId == null 
       select s; 

是不聰明的方式得到運送,這是很慢,如果分貝變得更大..

請幫幫忙!

+3

你有許多'nvarchar(max)'列......爲什麼? – SqlZim

+0

@SqlZim我只是設置它們'字符串'沒有給予限制。我應該給他們最大的價值? –

+0

我不認爲你真正的問題在於你建議的代碼。我認爲是在那些包含。這是分析所有這些價值的實際成本。一個問題:你真的在視圖中顯示所有這些列嗎? –

回答

3

顯然你需要檢查你的數據類型。它只是不可行的,你實際上需要很多VARCHAR(MAX)列。所以首先要從這個意義上重塑數據庫。我強烈建議你通過SQL Server Central看看Joe Celko的Stairway to Data系列,它會給你一個數據類型及其正確用法的清晰畫面。

在另一方面,如果你想只從使用LINQ某些字段,你可以用像去:

using (var ctx = new MyDataContext()) 
{ 
    var theDataINeed = (from myData in ctx.Shipping 
         where myData.TruckerId == null 
         select new { 
          myData.FromCity, 
          myData.FromState, 
          myData.FromZipCode, 
          myData.PickUpDateTime 
         }); 
} 

然後你把它傳遞給一個List<>左右,你會得到什麼只你需要。

相關問題