Problem with select in table with relationship Many to Many

Asked

Viewed 191 times

1

I have the following scenario:

public class Pedido
    {
        [Key]
        public int Id { get; set; }

        public virtual ICollection<ProdutosPedido> ProdutosPedidos { get; set; }

        public DateTime CreateDate { get; set; }

        public DateTime UpdateDate { get; set; }
    }

public class Produto
    {
        [Key]
        public int Id { get; set; }

        public string Descricao { get; set; }

        public string Valor { get; set; }

        public DateTime DataCadastro { get; set; }

        public virtual ICollection<ProdutosPedido> ProdutosPedidos { get; set; }
    }

 public class ProdutosPedido
    {
        [Key]
        public int ProdutosPedidoId { get; set; }

        public int ProdutoId { get; set; }

        public int PedidoId { get; set; }

        public int Quantidade { get; set; }

        public virtual Produto Produto { get; set; }

        public virtual Pedido Pedido { get; set; }

        public virtual Status Status { get; set; }
    }

I can save the order with the products without any problem, but I want to make a master table to show the order with your products.

Follows code of the Controller

public ActionResult TodosOsPedidos()
        {
            var pedidos = _db.ProdutosPedidos.Include("Pedido").Include("Produto").Where(x => x.Pedido.Id == 2);
            return View(pedidos);
        }

View code:

<table class="table table-condensed table-hover table-striped table-responsive">
    <thead>
        <tr>
            <th style="width: 85px">
                Pedido Nº
            </th>
            <th style="text-align: left">
                Solicitante
            </th>
            <th style="width: 120px">
                Data do Pedido
            </th>
            <th style="width: 120px">
                Atualizado Em
            </th>

            <th style="width: 65px"></th>
        </tr>
    </thead>

    <tbody>
        @foreach (var item in Model)
        {
            <tr>
                <td>
                    @Html.DisplayFor(modelItem => item.PedidoId)
                </td>
                <td style="text-align: left">
                    @Html.DisplayFor(modelItem => item.Pedido.Franqueado.NomeFantasia)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.Pedido.CreateDate)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.Pedido.UpdateDate)
                </td>

                <td>
                    <a href="@Url.Action("Edit", "Produtos", new { @id = item.PedidoId })" title="Editar" class="btn btn-xs btn-primary tool">
                        <span class="glyphicon glyphicon-edit"></span>
                    </a>
                    <a href="javascript:void(0)" rel="@item.PedidoId" title="Excluir" class="btn btn-xs btn-danger tool delete-produto">
                        <span class="glyphicon glyphicon-trash"></span>
                    </a>
                </td>
            </tr>
            <tr>
            <td style="width: 100%"  colspan="5">
                <h5>Produtos</h5>
                <table class="table table-condensed table-hover table-striped table-responsive">
                    <thead>
                        <tr>
                            <th>Descrição</th>
                            <th>Quantidade</th>
                            <th>Valor Unitário</th>
                            <th>Valor Total</th>
                            <th>Status</th>
                            <th></th>
                        </tr>
                    </thead>
                    <tbody>

                            <tr>
                                <td>@Html.DisplayFor(itemModel => item.Produto.Descricao)</td>
                                <td>@Html.DisplayFor(itemModel => item.Quantidade)</td>
                                <td>@Html.DisplayFor(itemModel => item.Produto.Valor)</td>
                                <td>@Html.DisplayFor(itemModel => item.Produto.Descricao)</td>
                                <td>@Html.DisplayFor(itemModel => item.Produto.Descricao)</td>
                                <td></td>
                            </tr>
                    </tbody>
                </table>
            </td>
        </tr>
        }
        </tbody>
</table>

I want to leave as the example below:

Nº Pedido     Solicitante          Data Criacao   Data Atualizacao
      1            Fornecedor 01        23/05/2014        27/05/2014
----------------------------------------------------------------------------------------------
Descrição     Qntd     Valor Uni     Valor Total         Status       #
Produto 01      02          3,50                7,00        Em Proc    editar

Nº Pedido     Solicitante          Data Criacao   Data Atualizacao
      2            Fornecedor 04       23/05/2014        27/05/2014
----------------------------------------------------------------------------------------------
Descrição     Qntd     Valor Uni     Valor Total         Status       #
Produto 01      02          3,50                7,00        Em Proc    editar
Produto 03      01          3,50                3,50        Em Proc    editar

But orders are repeating, all ID two orders are listed with your products, not just 1 ID Request 2 and below related products.

1 answer

1


Several things to fix:

1. Controller

public ActionResult TodosOsPedidos()
{
    var pedido = _db.Pedidos.Include(p => p.ProdutosPedidos).ToList();
    return View(pedido);
}

Make sure there is in the header the statement using System.Data.Entity;.

Avoid selecting by association.

2. View

Notice that here I change the @model for IEnumerable<Pedido> to make iteration more intuitive.

Missed iterating the requests:

<table class="table table-condensed table-hover table-striped table-responsive">
    <thead>
        <tr>
            <th style="width: 85px">
                Pedido Nº
            </th>
            <th style="text-align: left">
                Solicitante
            </th>
            <th style="width: 120px">
                Data do Pedido
            </th>
            <th style="width: 120px">
                Atualizado Em
            </th>

            <th style="width: 65px"></th>
        </tr>
    </thead>

    <tbody>
        @foreach (var item in Model) // Model é IEnumerable<Pedido>
        {
            <tr>
                <td>
                    @Html.DisplayFor(modelItem => item.Id)
                </td>
                <td style="text-align: left">
                    @Html.DisplayFor(modelItem => item.Franqueado.NomeFantasia)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.CreateDate)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.UpdateDate)
                </td>

                <td>
                    <a href="@Url.Action("Edit", "Produtos", new { @id = item.PedidoId })" title="Editar" class="btn btn-xs btn-primary tool">
                        <span class="glyphicon glyphicon-edit"></span>
                    </a>
                    <a href="javascript:void(0)" rel="@item.PedidoId" title="Excluir" class="btn btn-xs btn-danger tool delete-produto">
                        <span class="glyphicon glyphicon-trash"></span>
                    </a>
                </td>
            </tr>
            <tr>
            <td style="width: 100%"  colspan="5">
                <h5>Produtos</h5>
                <table class="table table-condensed table-hover table-striped table-responsive">
                    <thead>
                        <tr>
                            <th>Descrição</th>
                            <th>Quantidade</th>
                            <th>Valor Unitário</th>
                            <th>Valor Total</th>
                            <th>Status</th>
                            <th></th>
                        </tr>
                    </thead>
                    <tbody>
                        @foreach (var produtoPedido in item.ProdutosPedidos)
                            <tr>
                                <td>@Html.DisplayFor(itemModel => produtoPedido.Produto.Descricao)</td>
                                <td>@Html.DisplayFor(itemModel => produtoPedido.Quantidade)</td>
                                <td>@Html.DisplayFor(itemModel => produtoPedido.Produto.Valor)</td>
                                <td>@Html.DisplayFor(itemModel => produtoPedido.Produto.Descricao)</td>
                                <td>@Html.DisplayFor(itemModel => produtoPedido.Produto.Descricao)</td>
                                <td></td>
                            </tr>
                        }
                    </tbody>
                </table>
            </td>
        </tr>
        }
        </tbody>
</table>
  • In the part "p => p.ProductsPedidos.Product" the "Productospedidos" turns red and while hovering over the following message: "Cannot resolve symbol 'Productospedidos' Code is unreacheble"

  • @Hermesautran Then there is something wrong in your relationship in code. If Resharper indicates the property in red, it means that ProdutosPedidos does not exist in the Model Pedido.

  • My classes are as above. =/

  • @Hermesautran Colocou using System.Data.Entity in the header of your Controller?

  • It worked, the ProdutosPedidos is okay, but the Produto turned red.

  • True, because it is IEnumerable. Use only Include(p => p.ProdutosPedidos). I’ll fix the answer.

  • In the @foreach (var produtoPedido in Model.ProdutosPedidos) the ProdutosPedidos the same message appears Cannot resolve simbol 'ProdutosPedidos'

  • You changed the @model IEnumerable<Pedido> as I described in the reply?

  • Yes, it’s right here at View --> @model IEnumerable<Pedido>

  • My mistake. Change it @foreach (var produtoPedido in Model.ProdutosPedidos) for @foreach (var produtoPedido in item.ProdutosPedidos). I’ll change the answer again.

  • It worked exactly as I wanted, but the product data is coming blank.

  • Now it’s up to you. I don’t know how your data is.

  • I added the following p => p.ProdutosPedidos.Select(x => x.Produto) and it worked perfectly. It would be cool until you edit to be complete. Thank you very much Morrison!

Show 8 more comments

Browser other questions tagged

You are not signed in. Login or sign up in order to post.