LINQ查询未正确转换为数据库

时间:2012-11-21 18:00:35

标签: asp.net-mvc linq entity-framework asp.net-mvc-4 ef-code-first

我正在开发一个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子句被省略的原因吗?也许我的模特课上有什么东西?

感谢您的支持。

2 个答案:

答案 0 :(得分:4)

ToList调用将整个结果集带入内存,然后执行where,尝试以下操作:

dbHelpDesk.Chamados
            .Where(x => x.Nsu == NumeroChamado)
            .ToList()
            .Select(x => new ChamadosViewModel ...

答案 1 :(得分:1)

您在.ToList()之前使用了.Where(...。在您的情况下,.ToList()将占据整个表格。只需从您的查询中删除它,您应该很好。