خرید بک لینک

Vote count: 0

I want to dynamically build LinqToSQL and EntityFramework query clauses using a "criteria" object and if necessary leveraging the C# In a Nutshell PredicateBuilder (http://www.albahari.com/nutshell/predicatebuilder.aspx)

Just to be clear - I don't understand how to create C# expressions ;o)

The filter operator and value are defined as a property of my "query criteria" class as such:

public class QueryCriteria
{
    public DateTimeFilter DateTimeCompleted { get; set; }
}

The "filter" defined as:

public class DateTimeFilter
{
    public FilterOperator FilterOperator { get; set; }

    public DateTime FilterToken { get; set; }
}

And the "filter operator" is a plain C# enum:

public enum FilterOperator : int
{
    ExactMatch = 1,
    BeginsWith = 2,
    Contains = 3,
    EndsWith = 4,
    GreaterThan = 5,
    GreaterThanOrEqualTo = 6,
    LessThan = 7,
    LessThanOrEqualTo = 8,
}

I want to dynamically build my LinqToSQL and EntityFramework queries in my repositories using an approach such as:

if (criteria.DateTimeCompleted != null)
{
    var predicate = PredicateBuilder.True(query);

    switch (criteria.DateTimeCompleted.FilterOperator)
    {
        case FilterOperator.ExactMatch:
            predicate = predicate.And(p => string.Equals(p.DateTimeCompleted.Value, criteria.DateTimeCompleted.FilterToken));
            break;

        case FilterOperator.GreaterThan:
            predicate = predicate.And(p => p.DateTimeCompleted.Value > criteria.DateTimeCompleted.FilterToken);
            break;

        case FilterOperator.GreaterThanOrEqualTo:
            predicate = predicate.And(p => p.DateTimeCompleted.Value >= criteria.DateTimeCompleted.FilterToken);
            break;

        case FilterOperator.LessThan:
            predicate = predicate.And(p => p.DateTimeCompleted.Value < criteria.DateTimeCompleted.FilterToken);
            break;

        case FilterOperator.LessThanOrEqualTo:
            predicate = predicate.And(p => p.DateTimeCompleted.Value <= criteria.DateTimeCompleted.FilterToken);
            break;

        default:
            throw new InvalidOperationException("Can't use the specified filter operator on a DateTime.");
    }

    query = query.Where(predicate);
}

The above all works but I want my code to be DRY and when I add another property to my criteria (e.g. DateTimeStarted) I don't want my repository to duplicate the code immediately above for the new property.

So I want to simplify the above code to something like:

query = query.Where(criteria.DateTimeCompleted.GetPredicate(query, p => p.DateTimeCompleted.Value));

Is this possible and if so how?

asked 29 secs ago

برچسب: نویسنده: استخدام کار تاريخ: جمعه 8 مرداد 1395 ساعت: 16:36

صفحه بندی