B
Berryl Hesh
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 OnCriteriaChanged
method at the bottom that's getting out of hand (and I haven't finished all
combinations!)
public class ProjectPickerPresenter
{
private readonly List<WddProject> _allProjects;
public List<string> PrefixList { get; private set; }
public string PrefixFilter { get; set; }
public string SequenceNumberFilter { get; set; }
public string DescriptionFilter { get; set; }
public List<WddProject> DisplayProjects { get; private set; }
public ProjectPickerPresenter() {
_allProjects = new
OpenProjects(Connection.DbConnection(Connection.Env.Dev_IdentityDriven));
DisplayProjects = _allProjects;
PrefixList = new List<string>((from project in _allProjects orderby
project.Prefix select project.Prefix).Distinct());
}
public void OnCriteriaChange() {
// no filters
if( (PrefixFilter==null) && (SequenceNumberFilter==null) &&
(DescriptionFilter==null)) {
DisplayProjects = _allProjects;
}
// one filter only
else if ((PrefixFilter != null) && (SequenceNumberFilter == null) &&
(DescriptionFilter == null)) {
var result = _allProjects.Where(project =>
project.Prefix.Equals(PrefixFilter));
if (result != null) DisplayProjects = new
List<WddProject>(result);
}
else if ((PrefixFilter == null) && (SequenceNumberFilter != null) &&
(DescriptionFilter == null)) {
var result = _allProjects.Where(project =>
project.SequenceNumber.StartsWith(SequenceNumberFilter));
if (result != null) DisplayProjects = new
List<WddProject>(result);
}
else if ((PrefixFilter == null) && (SequenceNumberFilter == null) &&
(DescriptionFilter != null)) {
var result = _allProjects.Where(project =>
project.Description.Contains(DescriptionFilter));
if (result != null) DisplayProjects = new
List<WddProject>(result);
}
// two filters together
else if ((PrefixFilter != null) && (SequenceNumberFilter == null) &&
(DescriptionFilter != null)) {
var result = _allProjects.Where(project =>
project.Prefix.Equals(PrefixFilter) &&
project.Description.Contains(DescriptionFilter));
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 OnCriteriaChanged
method at the bottom that's getting out of hand (and I haven't finished all
combinations!)
public class ProjectPickerPresenter
{
private readonly List<WddProject> _allProjects;
public List<string> PrefixList { get; private set; }
public string PrefixFilter { get; set; }
public string SequenceNumberFilter { get; set; }
public string DescriptionFilter { get; set; }
public List<WddProject> DisplayProjects { get; private set; }
public ProjectPickerPresenter() {
_allProjects = new
OpenProjects(Connection.DbConnection(Connection.Env.Dev_IdentityDriven));
DisplayProjects = _allProjects;
PrefixList = new List<string>((from project in _allProjects orderby
project.Prefix select project.Prefix).Distinct());
}
public void OnCriteriaChange() {
// no filters
if( (PrefixFilter==null) && (SequenceNumberFilter==null) &&
(DescriptionFilter==null)) {
DisplayProjects = _allProjects;
}
// one filter only
else if ((PrefixFilter != null) && (SequenceNumberFilter == null) &&
(DescriptionFilter == null)) {
var result = _allProjects.Where(project =>
project.Prefix.Equals(PrefixFilter));
if (result != null) DisplayProjects = new
List<WddProject>(result);
}
else if ((PrefixFilter == null) && (SequenceNumberFilter != null) &&
(DescriptionFilter == null)) {
var result = _allProjects.Where(project =>
project.SequenceNumber.StartsWith(SequenceNumberFilter));
if (result != null) DisplayProjects = new
List<WddProject>(result);
}
else if ((PrefixFilter == null) && (SequenceNumberFilter == null) &&
(DescriptionFilter != null)) {
var result = _allProjects.Where(project =>
project.Description.Contains(DescriptionFilter));
if (result != null) DisplayProjects = new
List<WddProject>(result);
}
// two filters together
else if ((PrefixFilter != null) && (SequenceNumberFilter == null) &&
(DescriptionFilter != null)) {
var result = _allProjects.Where(project =>
project.Prefix.Equals(PrefixFilter) &&
project.Description.Contains(DescriptionFilter));
if (result != null) DisplayProjects = new
List<WddProject>(result);
}
}
}