where clause help

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

Göran Andersson

Berryl said:
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 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);
}
}
}

How about writing a comparer method? Something like:

private bool Compare(WddProject project) {
return
(PrefixFilter == null || project.Prefix == PrefixFilter) &&
(SequenceNumberFilter == null ||
project.SequenceNumber.StartsWith(SequenceNumberFilter)) &&
(DescriptionFilter == null ||
project.Description.Contains(DescriptionFilter));
}

public void OnCriteriaChange() {
if( (PrefixFilter==null) && (SequenceNumberFilter==null) &&
(DescriptionFilter==null)) {
DisplayProjects = _allProjects;
} else {
var result = _allProjects.Where(Compare);
if (result != null) DisplayProjects = result.ToList();
}
}
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top