Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12

Discussione: [LINQ] Where con date

  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2008
    residenza
    Turin, Italy
    Messaggi
    157

    [LINQ] Where con date

    Ciao,
    ho una EntityDataSource su cui, ad un certo punto, devo applicare una Where con una data. Qualcosa del tipo (vb.net):

    EDS.Where = "it.Contract Start > 01/01/2011"
    ListView.DataBind()

    Peccato che non funzioni in nessun modo. Qualcuno sa dirmi che sintassi devo usare? Ho cercato ovunque, ma non ho avuto fortuna.

  2. #2
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    Provato cosi? (è C#):
    codice:
    Datetime primoDellAnno = new DateTime(2011,1,1);
    EDS.Contract.Where(c => DateTime.Compare(c.ContractStart, primoDellAnno) > 0)
    oppure

    codice:
    Datetime primoDellAnno = new DateTime(2011,1,1);
    EDS.Contract.Where(c => c.ContractStart > primoDellAnno)

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2008
    residenza
    Turin, Italy
    Messaggi
    157
    Ciao,
    grazie del consiglio, ma penso stiamo parlando di due cose diverse. Cerco di spiegarmi meglio: ho una EntityDataSource abbastanza complessa, come segue:

    <asp:EntityDataSource
    ID="EDSStaff" runat="server"
    DefaultContainerName="MAST_HR_Entities" EntitySetName="tblContract"
    ConnectionString="name=MAST_HR_Entities" EnableUpdate="True"
    Include="tblSkill, tblCdC, tblCdC.tblUser, tblCompany, tblResource, tblEFTE">
    </asp:EntityDataSource>

    Da codice devo impostare una Where, che, quindi, deve essere una stringa. Quella sulla data è solo una parte; il resto è qualcosa tipo:

    strFilter = " it.ContractStatus = 'ATTIVO'"
    strFilter += " And it.tblCompany.CompanyID = 10"
    strFilter += " And it.ContractStart > 02/12/2010"

    EDSStaff.Where = strFilter
    lvStaff.DataBind()

    Il problema è che non prende la stringa in nessun modo. Si può fare un Compare qui?

  4. #4
    Utente di HTML.it L'avatar di GabbOne
    Registrato dal
    Mar 2006
    Messaggi
    577
    cip molto probabilmente è il formato della data che non va ....

    quello che devi fare è prelevare la data dall'area di testo (sempre se è l'utente che la immette) ad esempio 1/1/2011 trasformarla in un datetime

    codice:
    //Questo codice ha senso solo nel caso in cui validi la richiesta prima della trasformazione
    
    string[] inputString = DateTextBox.Text.Split('/');
    
                    int day = Int32.Parse(inputString[0]),
                    mounth = Int32.Parse(inputString[1]),
                    year = Int32.Parse(inputString[2]);
    
    DateTime date = new DateTime(year, mounth, day);
    poi quando nella Where del datasource devi utilizzare la data fai date.ToString();




    cmq ps. posta il messaggio di errore quando puoi

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2008
    residenza
    Turin, Italy
    Messaggi
    157
    Ci ho già provato.

    Penso che sia un errore banale di formato della query. Per esempio ho provato:

    strFilter += " And it.ContractStart > 02/12/2010 "

    o

    strFilter += " And it.ContractStart > '02/12/2010' "

    o

    strFilter += " And it.ContractStart > #02/12/2010# "

    o tanti altri, ma mi da sempre errore.

  6. #6
    Utente di HTML.it L'avatar di GabbOne
    Registrato dal
    Mar 2006
    Messaggi
    577
    guarda io piu di qualche volta ho creato filtri con le date e quello che ti posso dire è che quel modo costruire le query è piuttosto superato (e pericoloso) in asp.net

    quello che dovresti fare è sfruttare la sezione WhereParameter del datasource e impostando un parametro per la data ad esempio

    <asp:Parameter Type="DateTime" Name="MyDate" />

    quello che fai nel codice è sempilcemente impostare la proprietà DefaultValue con la data richiesta

    ... per farlo funzionare ovviamente questo parametro dovrebbe avere un valore iniziale che lo puoi settare con la data minima o massima (dipende dal tipo di confronto) che la sorgente dati sottostante ammette .. ad esempio per sqlServer potresti scrivere qualcosa del tipo
    codice:
    if(!Page.isPostBack)
    {
        MioDataSource.WhereParameters["MyDate"].DefaultValue = SqlDateTime.MinValue.ToString();
    }
    questa inizializzazione la puoi fare ad esempio nel page_init della tua pagina

    per approfondimenti sui parametrei potresti guardare questohttp://msdn.microsoft.com/en-us/library/xt50s8kz.aspx

  7. #7
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    ops, si scusa ho sbagliato io.

  8. #8
    Utente di HTML.it L'avatar di GabbOne
    Registrato dal
    Mar 2006
    Messaggi
    577

  9. #9
    Utente di HTML.it
    Registrato dal
    Feb 2008
    residenza
    Turin, Italy
    Messaggi
    157
    Non è da molto che mi sono avventurata in questa direzione, quindi non sono molto sicura di quello che faccio, ma nel mio caso ho una serie molto lunga di parametri e cambiano di volta in volta.
    Per cui ho usato questo tipo di sintassi per ovviare il problema. Altrimenti avrei dovuto inserire sia parametro che valore ogni volta e mi sembrava ancora più complicato

  10. #10
    Utente di HTML.it L'avatar di GabbOne
    Registrato dal
    Mar 2006
    Messaggi
    577
    Non vorrei fare il sapientone ma secondo me non risolvi la complessità di una query utilizzando una concatenazione di strighe in luogo di un parametro ...

    capisco che quando non si ha confidenza con un certo funzionamento certe cose possano sembrare difficili da gestire ma queste cose si affinano solo con l'esperienza ....

    Immagino che il tuo problema sia come far comparire / scomparire una certa condizione se un certo valore sia settato o meno , ecco perche ricorri al codice per costruire un filtro + o - complesso...


    nel maggior partre dei casi puoi ricorrere ad una semplice tecnica che ti permette di tener ben separati tutti i filtri ... ti faccio un esempio cercando di essere il piu chiaro possibile

    mettiamo che hai n Filtri che devono essere tutti verificati allora hai una condizione (Equivale al tuo WHERE)

    (Filtro 1) AND (Filtro2) AND (Filtro3) AND .... AND (FiltroN)

    Ora ogni filtro deve essere nella forma

    @Par = ValoreDiDefault OR proprietà=@Par

    Da quest'ultima capisci che per disattivare un filtro ti basta dare al parametro @Par un valore di Default che hai scelto te a priori rendendo l'equazione sempre vera per quel determinato filtro ... ti posso dire che è anche un modo efficente di gestire la cosa perche una OR restituisce vero alla prima condizione vera che incontra al suo interno senza continuare a valutare il resto dell'espressione)

    In asp.net inoltre le cose sono ancora piu semplificate poiche i parametri possono derivare direttamente da altri webcontrol senza quindi aver carico nel codice di impostarli manualmente o comunque nei casi piu complessi hai un carico di lavoro dovuto solo all'impostazione di questi valori e non di come le query debbano essere costruite (altrimenti avresti una serie di if - switch e quant'altro annidati tra loro difficili da manutenere nel caso in cui le carte in tavola cambino) ...

    Per il tuo problema ti posso dire che definendo un parametro in questa maniera
    codice:
    <WhereParameters>
                                <asp:Parameter Type="DateTime" Name="MyDate" />                        </WhereParameters>
    //(da notare che quando  definisci un parametro ne definisci anche il tipo)
    e impostando il parametro nel codice con questa istruzione

    MioDataSource.WhereParameters["MyDate"].DefaultValue = Valore

    riesci tranquillamente a fare un filtro per data

    Questa è una mia best pratices nulla di piu

    ps.
    Se qualcuno me la vuole criticare sono contento cosi se ne parla un po

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 © 2025 vBulletin Solutions, Inc. All rights reserved.