where clause help

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Berryl Hesh

    where clause help

    PROBLEM:
    I want to create a linq query of an in memory object based on 3 possible
    filters, and the only way I can think is something like the code below.
    Besides being verbose, I'm repeating myself. How can I rewrite this??

    Thanks for your help - BH

    CODE:
    I've included the whole class for context, but it's the OnCriteriaChang ed
    method at the bottom that's getting out of hand (and I haven't finished all
    combinations!)

    public class ProjectPickerPr esenter
    {
    private readonly List<WddProject _allProjects;
    public List<stringPref ixList { get; private set; }
    public string PrefixFilter { get; set; }
    public string SequenceNumberF ilter { get; set; }
    public string DescriptionFilt er { get; set; }
    public List<WddProject DisplayProjects { get; private set; }

    public ProjectPickerPr esenter() {
    _allProjects = new
    OpenProjects(Co nnection.DbConn ection(Connecti on.Env.Dev_Iden tityDriven));
    DisplayProjects = _allProjects;
    PrefixList = new List<string>((f rom project in _allProjects orderby
    project.Prefix select project.Prefix) .Distinct());
    }

    public void OnCriteriaChang e() {
    // no filters
    if( (PrefixFilter== null) && (SequenceNumber Filter==null) &&
    (DescriptionFil ter==null)) {
    DisplayProjects = _allProjects;
    }
    // one filter only
    else if ((PrefixFilter != null) && (SequenceNumber Filter == null) &&
    (DescriptionFil ter == null)) {
    var result = _allProjects.Wh ere(project =>
    project.Prefix. Equals(PrefixFi lter));
    if (result != null) DisplayProjects = new
    List<WddProject >(result);
    }
    else if ((PrefixFilter == null) && (SequenceNumber Filter != null) &&
    (DescriptionFil ter == null)) {
    var result = _allProjects.Wh ere(project =>
    project.Sequenc eNumber.StartsW ith(SequenceNum berFilter));
    if (result != null) DisplayProjects = new
    List<WddProject >(result);
    }
    else if ((PrefixFilter == null) && (SequenceNumber Filter == null) &&
    (DescriptionFil ter != null)) {
    var result = _allProjects.Wh ere(project =>
    project.Descrip tion.Contains(D escriptionFilte r));
    if (result != null) DisplayProjects = new
    List<WddProject >(result);
    }
    // two filters together
    else if ((PrefixFilter != null) && (SequenceNumber Filter == null) &&
    (DescriptionFil ter != null)) {
    var result = _allProjects.Wh ere(project =>
    project.Prefix. Equals(PrefixFi lter) &&
    project.Descrip tion.Contains(D escriptionFilte r));
    if (result != null) DisplayProjects = new
    List<WddProject >(result);
    }
    }
    }



  • =?ISO-8859-1?Q?G=F6ran_Andersson?=

    #2
    Re: where clause help

    Berryl Hesh wrote:
    PROBLEM:
    I want to create a linq query of an in memory object based on 3 possible
    filters, and the only way I can think is something like the code below.
    Besides being verbose, I'm repeating myself. How can I rewrite this??
    >
    Thanks for your help - BH
    >
    CODE:
    I've included the whole class for context, but it's the OnCriteriaChang ed
    method at the bottom that's getting out of hand (and I haven't finished all
    combinations!)
    >
    >
    public void OnCriteriaChang e() {
    // no filters
    if( (PrefixFilter== null) && (SequenceNumber Filter==null) &&
    (DescriptionFil ter==null)) {
    DisplayProjects = _allProjects;
    }
    // one filter only
    else if ((PrefixFilter != null) && (SequenceNumber Filter == null) &&
    (DescriptionFil ter == null)) {
    var result = _allProjects.Wh ere(project =>
    project.Prefix. Equals(PrefixFi lter));
    if (result != null) DisplayProjects = new
    List<WddProject >(result);
    }
    else if ((PrefixFilter == null) && (SequenceNumber Filter != null) &&
    (DescriptionFil ter == null)) {
    var result = _allProjects.Wh ere(project =>
    project.Sequenc eNumber.StartsW ith(SequenceNum berFilter));
    if (result != null) DisplayProjects = new
    List<WddProject >(result);
    }
    else if ((PrefixFilter == null) && (SequenceNumber Filter == null) &&
    (DescriptionFil ter != null)) {
    var result = _allProjects.Wh ere(project =>
    project.Descrip tion.Contains(D escriptionFilte r));
    if (result != null) DisplayProjects = new
    List<WddProject >(result);
    }
    // two filters together
    else if ((PrefixFilter != null) && (SequenceNumber Filter == null) &&
    (DescriptionFil ter != null)) {
    var result = _allProjects.Wh ere(project =>
    project.Prefix. Equals(PrefixFi lter) &&
    project.Descrip tion.Contains(D escriptionFilte r));
    if (result != null) DisplayProjects = new
    List<WddProject >(result);
    }
    }
    }
    >
    How about writing a comparer method? Something like:

    private bool Compare(WddProj ect project) {
    return
    (PrefixFilter == null || project.Prefix == PrefixFilter) &&
    (SequenceNumber Filter == null ||
    project.Sequenc eNumber.StartsW ith(SequenceNum berFilter)) &&
    (DescriptionFil ter == null ||
    project.Descrip tion.Contains(D escriptionFilte r));
    }

    public void OnCriteriaChang e() {
    if( (PrefixFilter== null) && (SequenceNumber Filter==null) &&
    (DescriptionFil ter==null)) {
    DisplayProjects = _allProjects;
    } else {
    var result = _allProjects.Wh ere(Compare);
    if (result != null) DisplayProjects = result.ToList() ;
    }
    }

    --
    Göran Andersson
    _____
    Göran Anderssons privata hemsida.

    Comment

    Working...