如何使用两个上下文改进查询 - MVC5,LINQ n EF

时间:2016-06-28 18:17:20

标签: entity-framework linq asp.net-mvc-5

我有两种情况。在其中一个我有两个视图,我得到与另一个上下文中的实体相关的鳕鱼。此查询花费的时间太长。如何改进?

        var negociacoes = _db.Negociacoes.Include(o=> o.User).ToArray();
        var produtos = _oriDb.Vw_Produtos.ToArray();
        var clientesVendedor = _oriDb.Vw_ClientesVendedores.ToArray();


        var query = from n in negociacoes
                    join p in produtos on n.ProdutoId equals p.ProdutoId
                    join c in clientesVendedor on n.ClienteId equals c.codigo_entidade


                    select new NegociacaoView
                    {
                        NegociacaoId = n.NegociacaoId,
                        ProdutoId = n.ProdutoId,
                        Produto = p.descricao,
                        ClienteId = n.ClienteId,
                        Cliente = c.razao_social,
                        Rca = n.Rca,
                        Quantidade = n.Quantidade,
                        Preco = n.Preco,
                        Situacao = n.Situacao,
                        UserId = n.User.UserName,
                        Atendente = n.Atendente,
                        CondicaoId = n.CondicaoId,
                        DataCriacao = n.DataCriacao,
                        DataLiberacao = n.DataLiberacao,
                        Observacao = n.Observacao,
                        User = n.User
                    };


        return query.ToList();

1 个答案:

答案 0 :(得分:0)

有几种方法可以加快速度:

  • 首先运行最小的最有效查询,然后使用这些结果来约束以下查询。
  • 定义一个选择列表,这样数据库就不必实现每一列,这样可以加快速度并减少内存使用。

不幸的是,不管你在LINQ中如何做到这一点,你最终会得到使用大型IN语句的sql。一个sproc可以让你访问更好的临时表和连接。

    var negociacoes = _db.Negociacoes.Include(o=> o.User).ToArray();
    //Use results of first query to constrain the second two. You could maybe combine the second two into one query.
    var clientIds = negociacoes.Select(x => x.ClienteId);
    var productIds = negociacoes.Select(x => x.ProdutoId);
    var produtos = _oriDb.Vw_Produtos
        .Where(x => productIds.Contains(x.ProdutoId))
        //add a select. You're only using two columns from this table.
        //.Select(x => new { })
        .ToArray();
    var clientesVendedor = _oriDb.Vw_ClientesVendedores
        .Where(x => clientIds.Contains(x.codigo_entidade))
        //add a select. You're only using two columns from this table.
        //.Select(x => new { })
        .ToArray();

    var query = from n in negociacoes
                join p in produtos on n.ProdutoId equals p.ProdutoId
                join c in clientesVendedor on n.ClienteId equals c.codigo_entidade


                select new NegociacaoView
                {
                    NegociacaoId = n.NegociacaoId,
                    ProdutoId = n.ProdutoId,
                    Produto = p.descricao,
                    ClienteId = n.ClienteId,
                    Cliente = c.razao_social,
                    Rca = n.Rca,
                    Quantidade = n.Quantidade,
                    Preco = n.Preco,
                    Situacao = n.Situacao,
                    UserId = n.User.UserName,
                    Atendente = n.Atendente,
                    CondicaoId = n.CondicaoId,
                    DataCriacao = n.DataCriacao,
                    DataLiberacao = n.DataLiberacao,
                    Observacao = n.Observacao,
                    User = n.User
                };


    return query.ToList();