1

我正在开发一个 MVC 网站,因为我是 mvc 的新手,所以我遇到了一些问题。这个真的很奇怪,一直困扰着我一段时间。我正在使用 LINQ 进行查询,其中一些查询非常非常慢。

然后我打开 SQL Server Profiler 以更接近的方式查找查询。我刚刚注意到,我的 LINQ 查询在没有 where 子句的情况下被发送到数据库,这使得执行需要很长时间。

现在我将发布代码的相关部分,看看你们是否会出错。

模型

[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 回答