HiveBrain v1.2.0
Get Started
← Back to all entries
patterncsharpModerate

Search query utilizing menus and checkboxes

Submitted by: @import:stackexchange-codereview··
0
Viewed 0 times
menussearchutilizingcheckboxesqueryand

Problem

I'm dealing with a searching query where the user will pick from menus and checkboxes the variables-criteria I'm passing to the toWeb method and a list will be returned. This works fine but I'm going to add two more variables and it's already hard to follow.

```
public List toWeb(string name, string egk, string
typosSumvan, Boolean olaTaSumvanta)
{
List listaSumvantwn = new List();

if (olaTaSumvanta == false)
{
if (egk != "")
{
if (typosSumvan != "")
{
using (var db = new CMMSEntity())
{
foreach (var a in db.sumvanta)
{
if (a.apodektis == name && a.egkatastasi == egk && a.eidosSumvan == typosSumvan)
{
listaSumvantwn.Add(readFromTable(a));
}
}
}
}
else
{
using (var db = new CMMSEntity())
{
foreach (var a in db.sumvanta)
{
if (a.apodektis == name && a.egkatastasi == egk)
{
listaSumvantwn.Add(readFromTable(a));
}
}
}
}
}
else
{
if (typosSumvan != "")
{
using (var db = new CMMSEntity())
{
foreach (var a in db.sumvanta)
{
if (a.apodektis == name && a.eidosSumvan == typosSumvan)
{
listaSumvantwn.Add(readFromTable(a));
}
}
}
}
else
{
using (var db = new CMMSEntity())
{
foreach (var a in db.sumvanta)

Solution

Each of your parameters is either adding a filter, or an ignored value.
We can construct a list of Predicates, each one corresponding to a single parameter.

public List toWeb(string name, string egk, string             
 typosSumvan, Boolean olaTaSumvanta)
 {
    var predicates = new List>();
    if (!olaTaSumvanta) { predicates.Add(row => row.apodektis == name) }
    if (egk != "") { predicates.Add(row => row.egkatastasi == egk) }
    if (typosSumvan != "") { predicates.Add(row => row.eidosSumvan == typosSumvan) }

    using (var db = new CMMSEntity())
    {
        foreach (var a in db.sumvanta)
        {
            if (a.IsValidEntity(predicates))
            {
                listaSumvantwn.Add(readFromTable(a));
            }
        }
    }
}


Using an extension method taken from this answer, we then apply all the filters.

public static Boolean IsValidEntity(this T entity, IEnumerable> predicates)
{
    return predicates.All(p => p(entity));
}

Code Snippets

public List<newEvent> toWeb(string name, string egk, string             
 typosSumvan, Boolean olaTaSumvanta)
 {
    var predicates = new List<Predicate<DataRow>>();
    if (!olaTaSumvanta) { predicates.Add(row => row.apodektis == name) }
    if (egk != "") { predicates.Add(row => row.egkatastasi == egk) }
    if (typosSumvan != "") { predicates.Add(row => row.eidosSumvan == typosSumvan) }

    using (var db = new CMMSEntity())
    {
        foreach (var a in db.sumvanta)
        {
            if (a.IsValidEntity(predicates))
            {
                listaSumvantwn.Add(readFromTable(a));
            }
        }
    }
}
public static Boolean IsValidEntity<T>(this T entity, IEnumerable<Predicate<T>> predicates)
{
    return predicates.All(p => p(entity));
}

Context

StackExchange Code Review Q#102502, answer score: 16

Revisions (0)

No revisions yet.