Visualizzazione dei risultati da 1 a 8 su 8

Discussione: EF LINQ Predicati

  1. #1
    Utente di HTML.it L'avatar di Fractals87
    Registrato dal
    Apr 2008
    Messaggi
    1,195

    EF LINQ Predicati

    Ciao a tutti,

    Mi trovo nella situazione di strutturare una query in base ai filtri che mi vengono forniti.
    codice:
                    string Sql = "SELECT * FROM Orders";
                    string Where = "";
                    if (CodeFilter.Text != "")
                    {
                        Where =" Code = '"  + CodeFilter.Text + "'";
                    }
                    if (IsNumeric(ClientDDFilter.SelectedValue))
                    {
                        if (Where != "")
                            Where += " AND";
                         Where += " Client_ClientID = " + ClientDDFilter.SelectedValue + "";
                    }
                    if (IsNumeric(StatusOrderDDFilter.SelectedValue))
                    {
                        if (Where != "")
                            Where += " AND";
                        Where += " StatusOrder_StatusOrderID = " + StatusOrderDDFilter.SelectedValue + "";
                    }
                    if (Where != "")
                    {
                        Sql +=" WHERE " +  Where;
                    }
                    OrderRepeater.DataSource = db.Orders.SqlQuery(Sql).ToList();
                    OrderRepeater.DataBind();
    Non riesco a capire come montare la query con un approccio linq.
    Come posso mettere i miei .where and Or....
    Per ora sono riuscito a costruirla con il metodo .SqlQuery ma non mi sembra il massimo della vita, anche perchè in questo caso EF va a farsi benedire.

    Grazie mille
    Ciao
    Paolo
    Che mestiere difficile.....essere da soli ancora di più

  2. #2
    fa' vedere come useresti l'approccio linq con una where che c'è sempre

  3. #3
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,308
    linq a parte, se vuoi un piccolo trucco puoi mettere sempre la stringa "WHERE 1=1" nella where, nei casi di composizione di query dove ci sono poi altri criteri di selezione, cosi' non devi controllare se è vuota o meno ogni volta.

    PS: io non ti ho detto nulla

  4. #4
    Utente di HTML.it L'avatar di Fractals87
    Registrato dal
    Apr 2008
    Messaggi
    1,195
    Non ho capito
    Questa dovrebbe essere una struttura linq con where sempre esistente.
    OrderRepeater.DataSource = db.Orders.Where(f => f.Code.Contains(CodeFilter.Text))

    questa invece con più where concatenate

    OrderRepeater.DataSource = db.Orders.Where(f => f.Code.Contains(CodeFilter.Text))
    .Where(f => f.Client.ClientID == ClientID)
    .Where(f => f.StatusOrder.StatusOrderID == Status).ToList();

    Ma non riesco a capire come metterci i miei if in mezzo.

    forse sbaglio proprio approccio.
    Che mestiere difficile.....essere da soli ancora di più

  5. #5
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,308
    Quote Originariamente inviata da Fractals87 Visualizza il messaggio
    Non ho capito
    Io mi limitavo a darti un consiglio generico, riguardo la costruzione delle query concatenando le stringhe.
    Modo che non andrebbe usato, ma ti ho dato lo stesso un consiglio perche' tutto serve.
    Ti stavo dicendo come evitare di controllare sempre se la where è vuota o piena, mettendola fissa a 'where 1=1'


    Linq nel mio post non c'entra nulla, lo conosco poco

  6. #6
    Utente di HTML.it L'avatar di Fractals87
    Registrato dal
    Apr 2008
    Messaggi
    1,195
    chiaro il concetto djciko, ma tu utilizzando poco linq cosa vai ad utilizzare nella tue applicazioni?
    il .SqlQuery?????

    Se si cambia qualcosa, perchè a parte le funzioni find() e poche altre io utilizzerei sempre la sql scritta da me.
    Che mestiere difficile.....essere da soli ancora di più

  7. #7
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,308
    le classi di ADO.Net con le stored procedure, ed anche Linq per applicazioni piu' moderne, ma mi trovo spesso su altri fronti di queste applicazioni

  8. #8
    Utente di HTML.it L'avatar di Fractals87
    Registrato dal
    Apr 2008
    Messaggi
    1,195
    Si anch'io ho sempre utilizzato ado.net, e mi sono sempre trovato bene.
    Al netto che i metodi offerti da linq e dbcontex ritornano le entità già belle che pronte, io ho la percezzione di tirare su sempre un sacco di dati, molti dei quali non mi servono e in alcuni casi non riuscire ad ottenere quelli che voglio.
    Ad esempio adesso ho costruito una sqlquery personalizzata che oltre a tutto faceva la somma della colonna qta di una tabella collegata.
    Il problema è che non si può accedere a tale proprietà in quanto non specificata della entity (Almeno mi pare cosi).
    E l'unico modo di risolvere trovato è stato calcolare il tutto lato codice.

    codice:
                                    DataTable dt = new DataTable();
                                    DataRow dr = null;
                                    dt.Columns.Add(new DataColumn("ProductName", typeof(string)));
                                    dt.Columns.Add(new DataColumn("Qta", typeof(string)));
                                    dt.Columns.Add(new DataColumn("QtaPrepared", typeof(string)));
                                    foreach (var ordRow in ord.OrderRows)
                                    {
                                        dr = dt.NewRow();
                                        dr["ProductName"] = ordRow.Product.Name;
                                        dr["Qta"] = ordRow.Qta;
                                        dr["QtaPrepared"] = ordRow.FulfillmentOrdorRows.Sum(f => f.QuantityLoaded);
                                        dt.Rows.Add(dr);
                                    }
                                    OrderRowRepeater.DataSource = dt;
                                    OrderRowRepeater.DataBind();
    Al posto di dovermi costruire la datatable, prima avrei passato una sql al data source, però il campo QtaPrepared (ottunuto da una sum del db) non c'era proprio.

    Allora mi sono costruito il mio datatable, e ho effettuato la somma con ordRow.FulfillmentOrdorRows.Sum(f => f.QuantityLoaded);
    Tu in questo caso avresti intrapreso altre strade?

    Ciao
    PAolo
    Che mestiere difficile.....essere da soli ancora di più

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2018 vBulletin Solutions, Inc. All rights reserved.