1

以下は私が使用しているコードで、取得元のデータベース テーブルには約 92000 レコードが含まれています。現在プルしている方法では、92000 レコードすべてをプルしてからフィルタリングを行っています。私が探しているのは、ページのロードに約 40 秒かからないように、DB からの最初のプルでフィルタリングすることです。これは私がまだ慣れていないものなので、これを行う方法と私の見解で機能させる方法について迷っています

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 が AutoMake テーブルの MakeName と等しいリコール テーブルからレコードのみを取得したいと考えています。

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

        };
    }
}
4

2 に答える 2

0

への呼び出しで DBaccess が行われたようDBCacheHelper.recallslistです。

この関数から/で実行されるSQLを編集する必要があります。

Eranga が指摘したように、多数のレコードを少数のレコードに絞り込む方法を示していません。一度に20または100が必要だと思いますか?もしそうなら、ここで受け入れられた答えを見てください:

ページングを実装する効率的な方法

具体的には、行 x から y のみを取得する方法を示すこの部分 (x = @p0 + 1 AND 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]
于 2012-09-10T16:03:55.573 に答える
0

リポジトリ メソッドの外にサーバー側のフィルタリングを追加する場合は、型を IEnumerable ではなく IQueryable として返す必要があり、.ToList、.AsEnumerable、または .GetEnumerator を呼び出す他のメソッドを呼び出さないでください。さらに、キャスト `(IEnumerable)c["GetAllRecalls"];' 式ツリーを保持して Entity Framework を使用するのではなく、後続の要求に LINQ to Objects を強制的に使用します。そうは言っても、データベースに変換できないため、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;
}
于 2012-09-10T18:22:48.657 に答える