The Rural Juror
The Rural Juror

Reputation: 89

Conditionally Insert Where Clause in LINQ Method Syntax with Select Many

Not sure if this possible using the LINQ method chain syntax or at all, but I would like to conditionally insert a where class in the chain if a parameter passed to the method is not null.

Here is the redundant code I would like to simplify:

public ICollection<Organization> getNetworkServiceRecipients(string serviceId = null)
{
    ICollection<Organization> children = get_all_children();
    if (serviceId != null)
    {
        return children.SelectMany(o => o.receives_these_services)
                        .Where(s => s.serviceId == serviceId)
                        .Select(o => o.serviceRecipient)
                        .Distinct()
                        .ToList();
    }
    else
    {
        return (children.SelectMany(o => o.receives_these_services)
                        .Select(o => o.serviceRecipient)
                        .Distinct()
                        .ToList());
    }
}

I have been trying to insert the where clause programmatically based on whether serviceId is null or not. All of the answers I have found where based on the query syntax, but I couldn't translate. Any suggestions?

Upvotes: 2

Views: 1465

Answers (3)

slimbofat
slimbofat

Reputation: 388

Similar answer as dotnetom, but uses a ternary to determine which lambda to use so that serviceId == null doesn't get executed on a per-item basis.

return children.SelectMany(o => o.receives_these_services)
            .Where( serviceId == null ? (_ => true) : (s => s.serviceId == serviceId))
            .Select(o => o.serviceRecipient)
            .Distinct()
            .ToList();

Upvotes: 0

John
John

Reputation: 17491

If you don't want to have it in the actual where query as dotnetom mentioned, you can do something like this:

public ICollection<Organization> getNetworkServiceRecipients(string serviceId = null)
{
    var services = get_all_children().SelectMany(o => o.receives_these_services);
    if (serviceId != null)
        services = services.Where(s => s.serviceId == serviceId);

    return services.Select(o => o.serviceRecipient)
                   .Distinct()
                   .ToList();
}

Upvotes: 4

dotnetom
dotnetom

Reputation: 24916

You can try this approach:

public ICollection<Organization> getNetworkServiceRecipients(string serviceId = null)
{
    ICollection<Organization> children = get_all_children();

    return children.SelectMany(o => o.receives_these_services)
                .Where(s => serviceId == null || s.serviceId == serviceId)
                .Select(o => o.serviceRecipient)
                .Distinct()
                .ToList();
}

In this case if your variable serviceId is null then only the first part of where condition would be executed, otherwise first part would be true and only second condition would matter.

Upvotes: 4

Related Questions