Domanda

Ok, ho già posto questa domanda, ma l'ho cancellata perché il modo in cui descrivevo il mio problema era sbagliato.

In primo luogo, lasciatemi dire che sto creando un'app .NET3.5 Winforms utilizzando C # e Plinqo (Professional Linq to Objects) come mio ORM. Ecco la mia situazione: ho un DataGridview che è popolato da un SortableBindingList < T > - nel mio caso, formato da un List < Task > che è semplicemente rappresentato come segue:

public class Task {
    public long TaskID { get; set; }
    public string TaskDescription { get; set; }
    public enumPriority TaskPriority { get; set; }
    public DateTime DueDate { get; set; }
    public double PercentageComplete { get; set; }
}  


Ora, voglio fornire una finestra di dialogo al mio utente per consentirgli di filtrare questo elenco. Immagino di passare un elenco di nomi di proprietà e DataType associato nella finestra di dialogo che posso usare per popolare un ComboBox. Quindi l'utente sceglierà quale proprietà desidera interrogare da comboBox e in base alla selezione saranno resi disponibili i comparatori appropriati e il controllo dell'interfaccia utente affinché l'utente inserisca i propri criteri. Infine, conterrà un pulsante di attivazione AND / OR alla fine che l'utente può utilizzare per aggiungere un criterio aggiuntivo. Ogni criterio sarà un oggetto di tipo FilterItem come mostrato di seguito:

public class FilterItem {
    public string MappedPropertyName { get; set; }
    public enumComparer Comparer { get; set; }
    public object FilterValue { get; set; }
    public enumOpertor Operator { get; set; }
}


Dopo che l'utente ha creato la sua query, intendo passare questo come List < FilterItem > al mio modulo di chiamata, che può quindi scorrere attraverso l'elenco e permettermi di filtrare il originale elenco < Task > .

Va ??tutto bene, e qualcosa che posso mettere insieme con facilità. Ma voglio assicurarmi che il meccanismo di filtro EFFETTIVO con cui vado sia il più fortemente tipizzato possibile, e non usando stringhe bulit-up come nella Libreria di query dinamiche. (Prima facevo qualcosa di simile con ADO.NET, DataViews e costruendo dinamicamente una stringa RowFilter)

Ho letto su PredicatBuilder e un articolo su tomasp.net , ma mi sembra fortemente confuso con esso e gli alberi delle espressioni in generale.

Cerco sinceramente la tua assistenza per aiutarmi a comprendere meglio questi concetti e come procedere per utilizzarlo in modo che la mia architettura prevista possa funzionare con esso.

Molto apprezzamento!

È stato utile?

Soluzione

Inoltre, so di poter fare qualcosa del tipo:

private SortableBindingList<Task> GetSortedTaskList()
{
        List<Task> list = new List<Task>();
        var query = DataUtil.GetUserTasks(xSys.Current.UserID);
        if (/*description condition met*/)
        {
            query = query.Where(x => x.TaskDescription.Contains(FilterDesc));
        }
        if (/*due date condition met*/)
        {
            query = query.Where(x => x.DueDate >= FilterDate);
        }
        if (/*priority condition met*/)
        {
            query = query.Where(x => x.TaskPriority == FilterPriority);
        }

    ...

        list = query.ToList();
        return new SortableBindingList<ArcTask>(list);
}


ma questo non sembra molto scalabile e 'dinamico'.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top