|
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Linq.Expressions;
using RepositoryProjectSample.Interfaces;
using RepositoryProjectSample.Helper;
namespace Jericho.DataAccess.Repository
{
public class Specification<E> : ISpecification<E>
{
#region Private Members
private Func<E, bool> _evalFunc = null;
private Expression<Func<E, bool>> _evalPredicate;
#endregion
#region Virtual Accessors
public virtual bool Matches(E entity)
{
return _evalPredicate.Compile().Invoke(entity);
}
public virtual Expression<Func<E, bool>> EvalPredicate
{
get { return _evalPredicate; }
}
public virtual Func<E, bool> EvalFunc
{
get { return _evalPredicate != null ? _evalPredicate.Compile() : null; }
}
#endregion
#region Constructors
public Specification(Expression<Func<E, bool>> predicate)
{
_evalPredicate = predicate;
}
private Specification() { }
#endregion
#region Private Nested Classes
private class AndSpecification : Specification<E>
{
private readonly ISpecification<E> _left;
private readonly ISpecification<E> _right;
public AndSpecification(ISpecification<E> left, ISpecification<E> right)
{
this._left = left;
this._right = right;
this._evalFunc =
(Func<E, bool>)Delegate.Combine
(left.EvalPredicate.Compile(),
right.EvalPredicate.Compile());
_evalPredicate = left.EvalPredicate.And(right.EvalPredicate);
}
public override bool Matches(E entity)
{
return EvalPredicate.Compile().Invoke(entity);
}
}
private class OrSpecification : Specification<E>
{
private readonly ISpecification<E> _left;
private readonly ISpecification<E> _right;
public OrSpecification(ISpecification<E> left, ISpecification<E> right)
{
this._left = left;
this._right = right;
this._evalFunc =
(Func<E, bool>)Delegate.Combine
(left.EvalPredicate.Compile(),
right.EvalPredicate.Compile());
_evalPredicate = left.EvalPredicate.Or(right.EvalPredicate);
}
public override bool Matches(E entity)
{
return EvalPredicate.Compile().Invoke(entity);
}
}
#endregion
#region Operator Overloads
public static Specification<E> operator &(Specification<E> left, ISpecification<E> right)
{
return new AndSpecification(left, right);
}
public static Specification<E> operator |(Specification<E> left, ISpecification<E> right)
{
return new OrSpecification(left, right);
}
#endregion
}
}
|
By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.
If a file you wish to view isn't highlighted, and is a text file (not binary), please
let us know and we'll add colourisation support for it.
In my childhood, my uncle has shown me how to see the cloud in a close look and I understand that one can draw some elements of the Earth in the sky-canvas if he/she wants to. After that the cloud becomes closer to me and It teaches me one thing that, a deeper-look to something will give you some clues to draw your imagination. You can able to see that one which you have build-up in your mind.
Years past, I have started my career as a software engineer and has been looking for passion in my coding and development which I should be to enjoy my profession and has started asking myself- 'am I doing any engineering here?!' Is my code becoming that thing which I have designed in my mind? So to find that answer I have tried that old solution here... I have decided to come closer to my code and start analyzing them. And it is really working for me and at least it gives me the confidence that I can build something that I really want to. I can draw my thinking there through my code and can build-up my vision that I have designed in my mind. It also helps me to think out of the box, solve each problems by making blocks and make me careful on each steps.
• Morshed's Technical Blog site: http://morshedanwar.wordpress.com/
• Morshed's Technical articles those are published in Codeproject site: http://www.codeproject.com/script/Articles/MemberArticles.aspx?amid=2992452
• Morshed's Linkedin profile: http://www.linkedin.com/in/morshedanwar
• Morshed's Facebook Profile : http://www.facebook.com/morshed.pulok
Beside all these I like to do - photography and music. Here is my Flickr photos : http://www.flickr.com/photos/morshed_anwar/