.OrderBy dynamically in Lambda

1

I have a field int called OrdemDosProdutosDestaque where I store the preference of the products order (My client that chooses and stores in the database).

ex:

1=Aleatório
2=Preço
3=Referência
4=Categoria
etc..

Model ConfigCustomer

[Column("int_SORT")]
    public int OrdemDosProdutosDestaque { get; set; }

    public string OrdemDestaque() {
//tentativa de transformar int em algo utilizavel
        var retorno = "";
        if (OrdemDosProdutosDestaque == 1)
        {
            retorno = "Aleatório";
        }
        else if (OrdemDosProdutosDestaque == 2)
        {
            retorno = "Valor";
        }
        //etc

        return retorno;
    }

Then there in my controller I want to sort the products according to the client option.

Something like:

IQueryable<produto> produtos = db.produtos
                        .Include(i => i.Cidade)
                        .Where(w => w.ClienteId == IDC && w.EstaAutorizado);

            if (ImovelEmDestaque)
            {
               produtos = produtos.OrderBy(o => o.cliente.ConfigCliente.OrdemDosProdutosDestaque);
            };

Of course, in this case I'm still sending to the int field, but how to send the properties as value, category, there product, or random, or if it's another model as photos?

    

asked by anonymous 04.07.2016 / 20:25

1 answer

2

This Include should be thus, by the principle of the use of anticipated load:

IQueryable<produto> produtos = db.produtos
                                 .Include(i => i.Cidade)
                                 .Include(i => i.Cliente.ConfigCliente)
                                 .Where(w => w.ClienteId == IDC && w.EstaAutorizado);

Only you want a special operation of ORDER BY on top of information you do not yet have. Better to select the client first:

var cliente = db.Clientes
                .Include(c => c.ConfigCliente)
                .FirstOrDefault(c => c.ClienteId == IDC);

Then use OrdemDosProdutosDestaque with switch :

switch (cliente.ConfigCliente.OrdemDosProdutosDestaque)
{
    case 2:
        produtos = produtos.OrderBy(p => p.Valor);
        break;
    ...
}

1. ToList()

if (cliente.ConfigCliente.OrdemDosProdutosDestaque == 1) {
    var lista = produtos.ToList().Shuffle();
}

2. Guids

if (cliente.ConfigCliente.OrdemDosProdutosDestaque == 1) {
    var lista = produtos.ToList().OrderBy(p => Guid.NewGuid());
}

EDIT

@TobyMosque gave the great suggestion of trying to order by .Shuffle() before materializing the list , and it works:

if (cliente.ConfigCliente.OrdemDosProdutosDestaque == 1) {
    var lista = produtos.OrderBy(p => Guid.NewGuid()).ToList();
}

The command can therefore be used in Guid .

    
04.07.2016 / 20:44