public virtual T Item(T item)
    {
        var applied = PartialApplier.PartialApply(KeyCompare, item);
        var result  = (Select().SingleOrDefault(applied));

        return(result);
    }
    public static Expression <Func <T2, TResult> > PartialApply <T, T2, TResult>(Expression <Func <T, T2, TResult> > expression, T value)
    {
        var result = new PartialApplier(expression.Parameters.First(), value).Visit(expression.Body);

        return((Expression <Func <T2, TResult> >)Expression.Lambda(result, expression.Parameters.Skip(1)));
    }