Home > Back-end >  Chaining where clauses returns 0 objects
Chaining where clauses returns 0 objects

Time:10-26

For a schoolproject i have to make a simple website where i have to search members based on what the user types and then display these members. I have 5 properties to look for (first and lastname, sex, level, club). They have to work together but some might be null.

public List<Lid> ZoekLeden(string deelVoornaam, string deelNaam, string geslacht, string niveau, string deelClubNaam)
{

    var filteredleden = context.Leden.Include(lid => lid.ClubNrNavigation)
        .OrderBy(l => l.Naam)
        .Where(l => l.Voornaam.Contains(deelVoornaam))
        .Where(l => l.Naam.Contains(deelNaam))
        .Where(l => l.Geslacht.Equals(geslacht))
        .Where(l => l.Niveau.Equals(niveau))
        .Where(l => l.ClubNrNavigation.Naam.Contains(deelClubNaam))
        .ToList();

    return filteredleden;
}

Sadly it keep returning 0 and i dont know why.

I tested each individual property and they all return the proper members. But the moment i use multiple they always return 0. Does anyone know why this happends and how i can fix it?

CodePudding user response:

Try this

public List<Lid> ZoekLeden(string deelVoornaam, string deelNaam, string geslacht, string niveau, string deelClubNaam)
{
    IQueryable<Lid> filteredleden = context.Leden
                        .Include(lid => lid.ClubNrNavigation);

    if (!string.IsNullOrEmpty(deelVoornaam))
        filteredleden = filteredleden.Where(l => l.Voornaam.Contains(deelVoornaam));

    if (!string.IsNullOrEmpty(deelNaam))
        filteredleden = filteredleden.Where(l => l.Naam.Contains(deelNaam))

    if (!string.IsNullOrEmpty(geslacht))
        filteredleden = filteredleden.Where(l => l.Geslacht.Equals(geslacht))

    if (!string.IsNullOrEmpty(niveau))
        filteredleden = filteredleden.Where(l => l.Niveau.Equals(niveau))

    if (!string.IsNullOrEmpty(deelClubNaam))
        filteredleden = filteredleden.Where(l => l.ClubNrNavigation.Naam.Contains(deelClubNaam));

    return filteredleden.OrderBy(l => l.Naam).ToList();
}

CodePudding user response:

You're chaining .Where() which is the equivalent of if(bool && bool && bool). Instead, I think you need if(bool || bool || bool)

So the LINQ statement should be:

    var filteredleden = context.Leden.Include(lid => lid.ClubNrNavigation)
    .OrderBy(l => l.Naam)
    .Where(l => l.Voornaam.Contains(deelVoornaam)
        || l.Naam.Contains(deelNaam)
        || l => l.Geslacht.Equals(geslacht)
        || l => l.Niveau.Equals(niveau)
        || l => l.ClubNrNavigation.Naam.Contains(deelClubNaam)
    )
    .ToList();

If you really do need the &&'s, then theres probably nothing in your dataset that meets all the criteria in the chained .Where()s

  • Related