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 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();
}
}
--
Göran Andersson
_____
http://www.guffa.com