1

私はMVCWebサイトに取り組んでいますが、MVCの初心者であるため、いくつかの問題に直面しています。これは本当に奇妙で、しばらくの間私を悩ませてきました。私はLINQを使用してクエリを作成していますが、その一部は本当に、本当に遅いものでした。

次に、SQL Server Profilerを開いて、より近い方法でクエリを探しました。LINQクエリがwhere句なしでデータベースに送信されているため、実行に時間がかかることに気づきました。

次に、コードの関連部分を投稿して、u人がそれで何か問題が発生する可能性があるかどうかを確認します。

モデル

[Table("tblSolicitacao")]
public partial class ChamadosViewModel
{
    [Key]        
    public int Nsu { get; set; }

    [Required(ErrorMessage = "*")]
    public int IdAutor { get; set; }

    [Required(ErrorMessage = "*")]
    [DisplayName("Assunto")]
    public string NomeDaSolicitacao { get; set; }

    [Required(ErrorMessage = "*")]
    [DisplayName("Descrição")]        
    public string Descricao { get; set; }

    [Required(ErrorMessage = "*")]
    [DisplayName("Grupo")]
    public string Grupo { get; set; }

    [Required(ErrorMessage = "*")]
    [DisplayName("Atividade")]
    public string Atividade { get; set; }

    [Required(ErrorMessage = "*")]
    [DisplayName("Prioridade")]
    public string Prioridade { get; set; }

    [Required(ErrorMessage = "*")]
    [DataType(DataType.DateTime, ErrorMessage = "Formato de Data Inválido")]        
    public Nullable<System.DateTime> DataPretendidaPeloAutor { get; set; }
    public Nullable<bool> AcompanharViaEmail { get; set; }
    public Nullable<int> IdAnalistaDesignado { get; set; }
    public string Complexidade { get; set; }
    public Nullable<System.DateTime> DataPrevistaPeloAnalista { get; set; }
    public Nullable<int> SubordinacaoDeSolicitacao { get; set; }
    public string COD_FORNECEDOR { get; set; }
    public Nullable<decimal> TOLERANCIA { get; set; }
    public string DESC_COND_PGTO { get; set; }
    public string FILIAL_FATURAR { get; set; }
    public string FILIAL_ENTREGA { get; set; }
    public string FILIAL_COBRANCA { get; set; }
    public string MOTIVO_COMPRA { get; set; }
    public Nullable<int> TIPO_SOLICITACAO { get; set; }
    public string FORMA_PGTO { get; set; }
    public string MOTIVOCHAMADO { get; set; }
    public Nullable<int> TEMPORESOLUCAO { get; set; }
    public string CodigoRateioFilial { get; set; }
    public string CodigoRateioCentroCusto { get; set; }
    public Nullable<System.DateTime> DataSolicitacao { get; set; }

    [NotMapped]
    public string NomeAutor { get; set; }
    [NotMapped]
    public string NomeAnalista { get; set; }

    public IEnumerable<genericoGruposViewModel> Grupos { get; set; }
    [NotMapped]
    public List<ListItem> Transitos { get; set; }
    public List<string> Complexidades { get; set; }
    public IEnumerable<genericoGrupoAtividadeViewModel> Atividades { get; set; }
    public IEnumerable<genericoPrioridadeViewModel> Prioridades { get; set; }
    public IEnumerable<ColaboradorViewModel> Usuarios { get; set; }

    [NotMapped]
    IEnumerable<ColaboradorViewModel> AnalistasDesignados { get; set; }
}

コントローラ

    ChamadosViewModel ChamadoDetalhe = new ChamadoDetalhe();

    ChamadoDetalhe = _dbHelpDesk.Chamados
                .ToList()
                .Where(x => x.Nsu == NumeroChamado)
                .Select(x => new ChamadosViewModel
                        {
                            Nsu = x.Nsu,
                            IdAutor = x.IdAutor,
                            NomeDaSolicitacao = x.NomeDaSolicitacao,
                            Descricao = x.Descricao,
                            Grupo = x.Grupo,
                            Atividade = x.Atividade,
                            Prioridade = x.Prioridade,
                            DataPretendidaPeloAutor = x.DataPretendidaPeloAutor,
                            AcompanharViaEmail = x.AcompanharViaEmail,
                            IdAnalistaDesignado = x.IdAnalistaDesignado,
                            Complexidade = x.Complexidade,
                            DataPrevistaPeloAnalista = x.DataPrevistaPeloAnalista,
                            SubordinacaoDeSolicitacao = x.SubordinacaoDeSolicitacao,
                            COD_FORNECEDOR = x.COD_FORNECEDOR,
                            TOLERANCIA = x.TOLERANCIA,
                            DESC_COND_PGTO = x.DESC_COND_PGTO,
                            FILIAL_FATURAR = x.FILIAL_FATURAR,
                            FILIAL_ENTREGA = x.FILIAL_ENTREGA,
                            FILIAL_COBRANCA = x.FILIAL_COBRANCA,
                            MOTIVO_COMPRA = x.MOTIVO_COMPRA,
                            TIPO_SOLICITACAO = x.TIPO_SOLICITACAO,
                            FORMA_PGTO = x.FORMA_PGTO,
                            MOTIVOCHAMADO = x.MOTIVOCHAMADO,
                            TEMPORESOLUCAO = x.TEMPORESOLUCAO,
                            CodigoRateioFilial = x.CodigoRateioFilial,
                            CodigoRateioCentroCusto = x.CodigoRateioCentroCusto,
                            DataSolicitacao = x.DataSolicitacao
                        }
                    )
                    .Single()

そしてそれはデータベースに行った選択です

    SELECT 
        [Extent1].[Nsu] AS [Nsu], 
        [Extent1].[IdAutor] AS [IdAutor], 
        [Extent1].[NomeDaSolicitacao] AS [NomeDaSolicitacao], 
        [Extent1].[Descricao] AS [Descricao], 
        [Extent1].[Grupo] AS [Grupo], 
        [Extent1].[Atividade] AS [Atividade], 
        [Extent1].[Prioridade] AS [Prioridade], 
        [Extent1].[DataPretendidaPeloAutor] AS [DataPretendidaPeloAutor], 
        [Extent1].[AcompanharViaEmail] AS [AcompanharViaEmail], 
        [Extent1].[IdAnalistaDesignado] AS [IdAnalistaDesignado], 
        [Extent1].[Complexidade] AS [Complexidade], 
        [Extent1].[DataPrevistaPeloAnalista] AS [DataPrevistaPeloAnalista], 
        [Extent1].[SubordinacaoDeSolicitacao] AS [SubordinacaoDeSolicitacao], 
        [Extent1].[COD_FORNECEDOR] AS [COD_FORNECEDOR], 
        [Extent1].[TOLERANCIA] AS [TOLERANCIA], 
        [Extent1].[DESC_COND_PGTO] AS [DESC_COND_PGTO], 
        [Extent1].[FILIAL_FATURAR] AS [FILIAL_FATURAR], 
        [Extent1].[FILIAL_ENTREGA] AS [FILIAL_ENTREGA], 
        [Extent1].[FILIAL_COBRANCA] AS [FILIAL_COBRANCA], 
        [Extent1].[MOTIVO_COMPRA] AS [MOTIVO_COMPRA], 
        [Extent1].[TIPO_SOLICITACAO] AS [TIPO_SOLICITACAO], 
        [Extent1].[FORMA_PGTO] AS [FORMA_PGTO], 
        [Extent1].[MOTIVOCHAMADO] AS [MOTIVOCHAMADO], 
        [Extent1].[TEMPORESOLUCAO] AS [TEMPORESOLUCAO], 
        [Extent1].[CodigoRateioFilial] AS [CodigoRateioFilial], 
        [Extent1].[CodigoRateioCentroCusto] AS [CodigoRateioCentroCusto], 
        [Extent1].[DataSolicitacao] AS [DataSolicitacao]
    FROM [dbo].[tblSolicitacao] AS [Extent1]

皆さんは、このwhere句が省略された理由を想像できますか?多分私のモデルクラスに何か?

ご支援ありがとうございます。

4

2 に答える 2

4

このToList呼び出しにより、結果セット全体がメモリに取り込まれ、whereを実行している場合は、次のことを試してください。

dbHelpDesk.Chamados
            .Where(x => x.Nsu == NumeroChamado)
            .ToList()
            .Select(x => new ChamadosViewModel ...
于 2012-11-21T18:03:28.253 に答える
1

.ToList()の前に使用しました.Where(....ToList()あなたの状況でテーブル全体をつかみます。クエリからそれを削除するだけで、問題はありません。

于 2012-11-21T18:04:16.963 に答える