reach4thelasers
reach4thelasers

Reputation: 26909

Perform an OR of two LINQ IQueryables

I've got two IQueryables:

    public static IQueryable<Counterparty> SearchByCode(this IQueryable<Counterparty> queryable, string searchQuery)
    {
        return queryable.Where(x => x.Code.StartsWith(searchQuery.ToUpper()));
    }

    public static IQueryable<Counterparty> SearchByName(this IQueryable<Counterparty> queryable, string searchQuery)
    {
        return queryable.Where(x => x.Name.ToLower().Contains(searchQuery.ToLower()));
    }

I want to create another IQueryable which combines the two queries as an OR e.g

    public static IQueryable<Counterparty> SearchByCodeOrName(this IQueryable<Counterparty> queryable, string searchQuery)
    {
        // return SearchByName(searchQuery) OR SearchByCode(searchQuery)
    }

I'd rather avoid duplication of code so I want to reuse the existing queryables rather than rewriting a new lambda expression like Where(x=> x.Code.StartsWith.... || x.Name.Contains.....)

Upvotes: 3

Views: 160

Answers (2)

Ulf &#197;kerstedt
Ulf &#197;kerstedt

Reputation: 3236

Depending on what code you do want to be able to reuse, this could be an alternative way of doing it where you are not duplicating the inner workings of your query conditions:

    private static Func<Counterparty, string, bool> CodeStartsWith = (x, searchQuery) => x.Code.StartsWith(searchQuery.ToUpper());

    private static Func<Counterparty, string, bool> NameContains = (x, searchQuery) => x.Name.Contains(searchQuery.ToLower());

    public static IQueryable<Counterparty> SearchByCode(this IQueryable<Counterparty> queryable, string searchQuery)
    { 
        return queryable.Where(x => CodeStartsWith(x, searchQuery)); 
    }

    public static IQueryable<Counterparty> SearchByName(this IQueryable<Counterparty> queryable, string searchQuery)
    {
        return queryable.Where(x => NameContains(x, searchQuery)); 
    }

    public static IQueryable<Counterparty> SearchByCodeOrName(this IQueryable<Counterparty> queryable, string searchQuery)
    {
        return queryable.Where(x => NameContains(x, searchQuery) || CodeStartsWith(x, searchQuery)); 
    }

Upvotes: 1

Oblivion2000
Oblivion2000

Reputation: 616

You can probably .Union the results of the two together

public static IQueryable<Counterparty> SearchByCodeOrName(this IQueryable<Counterparty> queryable, string searchQuery)
{
     return SearchByName(searchQuery).Union(SearchByCode(searchQuery))
}

Upvotes: 5

Related Questions