2012-06-03 39 views
1

下面是我正在使用的代码和它从中拉取的数据库表中有大约92000条记录。它现在拉的方式是拉动所有92000条记录然后进行过滤。 我期望做的是过滤从数据库的初始拉,以便它不需要大约40秒来加载页面。 这事我还是新的,所以我失去了对如何做到这一点,并使其与我的观点工作加速大Linq到实体调用MVC3

public ViewResult Makes() 
{ 
    var items = (from item in DBCacheHelper.recallslist 
       orderby item.MFGTXT ascending 
       select item.ToDomainRecall()).GroupBy(item => item.MFGTXT).Select(grp => grp.First()); 


    return View(items); 
} 

public static IEnumerable<Recall> recallslist 
{ 
    get 
    { 
     if (c["GetAllRecalls"] == null) 
     { 
      c.Insert("GetAllRecalls", GetAllRecalls()); 
      return (IEnumerable<Recall>)c["GetAllRecalls"]; 
     } 
     else 
     { 
      return (IEnumerable<Recall>)c["GetAllRecalls"]; 
     } 
    } 
} 



public static IEnumerable<Recall> GetAllRecalls() 
{ 
    using (DealerContext context = new DealerContext()) 
    { 
     var items = from item in context.recalls.ToList<Recall>() 
        select item.ToDomainRecall(); 
     return items.ToList<Recall>(); 
    } 
} 


SELECT 
[Extent1].[RecallsId] AS [RecallsId], 
[Extent1].[RECORD_ID] AS [RECORD_ID], 
[Extent1].[CAMPNO] AS [CAMPNO], 
[Extent1].[MAKETXT] AS [MAKETXT], 
[Extent1].[MODELTXT] AS [MODELTXT], 
[Extent1].[YEARTXT] AS [YEARTXT], 
[Extent1].[MFGCAMPNO] AS [MFGCAMPNO], 
[Extent1].[COMPNAME] AS [COMPNAME], 
[Extent1].[MFGNAME] AS [MFGNAME], 
[Extent1].[BGMAN] AS [BGMAN], 
[Extent1].[ENDMAN] AS [ENDMAN], 
[Extent1].[RCLTYPECD] AS [RCLTYPECD], 
[Extent1].[POTAFF] AS [POTAFF], 
[Extent1].[ODATE] AS [ODATE], 
[Extent1].[INFLUENCED_BY] AS [INFLUENCED_BY], 
[Extent1].[MFGTXT] AS [MFGTXT], 
[Extent1].[RCDATE] AS [RCDATE], 
[Extent1].[DATEA] AS [DATEA], 
[Extent1].[RPNO] AS [RPNO], 
[Extent1].[FMVSS] AS [FMVSS], 
[Extent1].[DESC_DEFECT] AS [DESC_DEFECT], 
[Extent1].[CONEQUENCE_DEFECT] AS [CONEQUENCE_DEFECT], 
[Extent1].[CORRECTIVE_ACTION] AS [CORRECTIVE_ACTION], 
[Extent1].[NOTES] AS [NOTES], 
[Extent1].[RCL_CMPT_ID] AS [RCL_CMPT_ID] 
FROM [dbo].[Recalls] AS [Extent1] 

更新:

最后,我想只从召回拉记录表,其中MFGTXT等于 MakeName在AUTOMAKE表

public class AutoMake 
{ 
    [Key] 
    public int MakeID { get; set; } 
    public string MakeName { get; set; } 

public AutoMake ToDomainAutoMakes() 
{ 
    return new AutoMake 
    { 
     MakeID = this.MakeID, 
     MakeName = this.MakeName 
    }; 
} 

}

public class Recall 
{ 
    [Key] 
    public int RecallsId { get; set; } 
    public string RECORD_ID { get; set; } 
    public string CAMPNO { get; set; } 
    public string MAKETXT { get; set; } 
    public string MODELTXT { get; set; } 
    public string YEARTXT { get; set; } 
    public string MFGCAMPNO { get; set; } 
    public string COMPNAME { get; set; } 
    public string MFGNAME { get; set; } 
    public string BGMAN { get; set; } 
    public string ENDMAN { get; set; } 
    public string RCLTYPECD { get; set; } 
    public string POTAFF { get; set; } 
    public string ODATE { get; set; } 
    public string INFLUENCED_BY { get; set; } 
    public string MFGTXT { get; set; } 
    public string RCDATE { get; set; } 
    public string DATEA { get; set; } 
    public string RPNO { get; set; } 
    public string FMVSS { get; set; } 
    public string DESC_DEFECT { get; set; } 
    public string CONEQUENCE_DEFECT { get; set; } 
    public string CORRECTIVE_ACTION { get; set; } 
    public string NOTES { get; set; } 
    public string RCL_CMPT_ID { get; set; } 

    public Recall ToDomainRecall() 
    { 
     return new Recall 
     { 
      RECORD_ID = this.RECORD_ID, 
      CAMPNO = this.CAMPNO, 
      MAKETXT = this.MAKETXT, 
      MODELTXT = this.MODELTXT, 
      YEARTXT = this.YEARTXT, 
      MFGCAMPNO = this.MFGCAMPNO, 
      COMPNAME = this.COMPNAME, 
      MFGNAME = this.MFGNAME, 
      BGMAN = this.BGMAN, 
      ENDMAN = this.ENDMAN, 
      RCLTYPECD = this.RCLTYPECD, 
      POTAFF = this.POTAFF, 
      ODATE = this.ODATE, 
      INFLUENCED_BY = this.INFLUENCED_BY, 
      MFGTXT = this.MFGTXT, 
      RCDATE = this.RCDATE, 
      DATEA = this.DATEA, 
      RPNO = this.RPNO, 
      FMVSS = this.FMVSS, 
      DESC_DEFECT = this.DESC_DEFECT, 
      CONEQUENCE_DEFECT = this.CONEQUENCE_DEFECT, 
      CORRECTIVE_ACTION = this.CORRECTIVE_ACTION, 
      NOTES = this.NOTES, 
      RCL_CMPT_ID = this.RCL_CMPT_ID 

     }; 
    } 
} 
+0

您能否显示如何过滤记录? – Eranga

+0

我认为你需要一个外键... – RPM1984

回答

0

如果您要添加的存储库方法之外的服务器端过滤,你需要回到你的类型为IQueryable的,而不是IEnumerable和不叫.ToList,.AsEnumerable,或会导致任何其他方法。 GetEnumerator被调用。另外,你的cast {(IEnumerable)c [“GetAllRecalls”];'强制LINQ to Objects用于后续请求,而不是保留表达式树并使用Entity Framework。也就是说,您可能需要将您的调用移至ToDomainRecall方法,以便在应用了附加过滤器之后,因为该方法不能转换为您的数据库。以下是您需要进行的一些更改:

public ViewResult Makes() 
{ 
    var items = (from item in DBCacheHelper.recallslist 
       orderby item.MFGTXT ascending 
       select item.ToDomainRecall()).GroupBy(item => item.MFGTXT).Select(grp => grp.First()); 


    return View(items); 
} 

public static IQueryable<Recall> recallslist 
{ 
    get 
    { 
     if (c["GetAllRecalls"] == null) 
     { 
      c.Insert("GetAllRecalls", GetAllRecalls(context)); 
     } 
     return c["GetAllRecalls"]; 

    } 
} 



public static IQueryable<Recall> GetAllRecalls(DealerContext context) 
{ 
     var items = context.recalls; 
     return items; 
} 
0

看起来你的DBaccess是在DBCacheHelper.recallslist的调用中完成的。

您需要编辑从该函数中运行的SQL。如Eranga指出的那样,你不会显示如何过滤大量的记录到更少的记录。我假设你一次需要20或100个?如果是的话,请看这里接受的答案:

efficient way to implement paging

具体来说,这一部分它展示了如何只检索行X到Y(其中x = @ P0 + 1和Y = @ P0 + @ P1) :

SELECT [t1].[CodCity], 
    [t1].[CodCountry], 
    [t1].[CodRegion], 
    [t1].[Name], 
    [t1].[Code] 
FROM (
    SELECT ROW_NUMBER() OVER (
     ORDER BY [t0].[CodCity], 
     [t0].[CodCountry], 
     [t0].[CodRegion], 
     [t0].[Name], 
     [t0].[Code]) AS [ROW_NUMBER], 
     [t0].[CodCity], 
     [t0].[CodCountry], 
     [t0].[CodRegion], 
     [t0].[Name], 
     [t0].[Code] 
    FROM [dbo].[MtCity] AS [t0] 
    ) AS [t1] 
WHERE [t1].[ROW_NUMBER] BETWEEN @p0 + 1 AND @p0 + @p1 
ORDER BY [t1].[ROW_NUMBER]