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);
}
}
}
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);
}
}
}
Comment