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

Refactor IQueryable and IEnumerable that share the same condition

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

Problem

I have extension methods to encapsulate query conditions, however I have to separate IQueryable and IEnumerable. Is there any way I can reduce the redundancy and still not lose the performance benefit of IQueryable?

public static class PAYTRACK_PARTNER_Extension 
{
    public static IQueryable WhereInPayer(this IQueryable query, int payerId)
    {
        var result = query.Where(q => q.payer_id == payerId);
        return result;
    }

    public static IEnumerable WhereInPayer(this IEnumerable query, int payerId)
    {
        var result = query.Where(q => q.payer_id == payerId);
        return result;
    }

    public static IQueryable WhereInPayee(this IQueryable query, int payeeId)
    {
        var result = query.Where(q => q.payee_id == payeeId);
        return result;
    }

    public static IEnumerable WhereInPayee(this IEnumerable query, int payeeId)
    {
        var result = query.Where(q => q.payee_id == payeeId);
        return result;
    }

    public static IQueryable WhereIsNotApproved(this IQueryable query)
    {
        var result = query.Where(q => q.partner_is_approve.GetValueOrDefault(false).Equals(false));
        return result;
    }

    public static IEnumerable WhereIsNotApproved(this IEnumerable query)
    {
        var result = query.Where(q => q.partner_is_approve.GetValueOrDefault(false).Equals(false));
        return result;
    }

    public static PAYTRACK_PARTNER SingleByPayerAndPayee(this IQueryable query, int payerId, int payeeId)
    {
        var result = query.Single(q => q.payer_id == payerId && q.payee_id == payeeId);
        return result;
    }

    public static PAYTRACK_PARTNER SingleByPayerAndPayee(this IEnumerable query, int payerId, int payeeId)
    {
        var result = query.Single(q => q.payer_id == payerId && q.payee_id == payeeId);
        return result;
    }
}

Solution

You can use IQueryable everywhere, because you can convert to it from IEnumerable by using AsQueryable():

public static IQueryable WhereInPayer(
    this IQueryable query, int payerId)
{
    var result = query.Where(q => q.payer_id == payerId);
    return result;
}

public static IEnumerable WhereInPayer(
     this IEnumerable query, int payerId)
{
     return query.AsQueryable().WhereInPayer(payerId);
}


Also, names in ALL_CAPS are not commonly used in C#, you should adopt c# naming conventions.

Code Snippets

public static IQueryable<PAYTRACK_PARTNER> WhereInPayer(
    this IQueryable<PAYTRACK_PARTNER> query, int payerId)
{
    var result = query.Where(q => q.payer_id == payerId);
    return result;
}

public static IEnumerable<PAYTRACK_PARTNER> WhereInPayer(
     this IEnumerable<PAYTRACK_PARTNER> query, int payerId)
{
     return query.AsQueryable().WhereInPayer(payerId);
}

Context

StackExchange Code Review Q#28276, answer score: 5

Revisions (0)

No revisions yet.