Ciągnięcie poza wyrażenie <Func <T, obiekt >>

Jestem zajęty tworzeniem metod rozszerzenia opakowaniaElegancki iDapperExtensions. W tej chwili próbuję dodać filtrowanie doGetList<T> metoda rozszerzenia, podobna do LINQWhere<T> metoda rozszerzenia. widziałemto pytanie ale wydaje mi się, że nie mogę zrealizować tegoZasugerował Marc Gravell ponieważ nie ma typuEqualsExpression w .NET 4.5. Oto kod demo, który pomoże wyjaśnić mój problem:

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Diagnostics;
using System.Linq.Expressions;
using DapperExtensions;

namespace Dapper.Extensions.Demo
{
    public class Program
    {
        private static readonly string ConnectionString = ConfigurationManager.ConnectionStrings["DapperDbContext"].ConnectionString;
        public static IDbConnection Connection { get { return new SqlConnection(ConnectionString); } }

        public static void Main(string[] args)
        {
            const int marketId = 2;
            var matchingPeople = Connection.Get<Person>(p => p.MarketId, marketId); // This works

            // Below is a LambdaExpression. expression.Body is, bizarrely, a UnaryExpression with a Convert
            //var matchingPeople = Connection.Get<Person>(p => p.MarketId == marketId); // Does not work

            foreach (var person in matchingPeople)
            {
                Console.WriteLine(person);
            }

            if (Debugger.IsAttached)
                Console.ReadLine();
        }
    }

    public static class SqlConnectionExtensions
    {
        public static IEnumerable<T> Get<T>(this IDbConnection connection, Expression<Func<T, object>> expression, object value = null) where T : class
        {
            using (connection)
            {
                connection.Open();

                // I want to be able to pass in: t => t.Id == id then:
                // Expression<Func<T, object>> expressionOnLeftOfFilterClause = t => t.Id;
                // string operator = "==";
                // object valueFromLambda = id;
                // and call Predicates.Field(expressionOnLeftOfFilterClause, Operator.Eq, valueFromLambda)

                var predicate = Predicates.Field(expression, Operator.Eq, value);
                var entities = connection.GetList<T>(predicate, commandTimeout: 30);
                connection.Close();
                return entities;
            }
        }
    }

    public class Person
    {
        public int Id { get; set; }

        public string FirstName { get; set; }

        public string Surname { get; set; }

        public int MarketId { get; set; }

        public override string ToString()
        {
            return string.Format("{0}: {1}, {2} - MarketId: {3}", Id, Surname, FirstName, MarketId);
        }
    }
}

Zwracając szczególną uwagę na mojąGet<T> metoda rozszerzania: kiedy przejdę w inny sposóbp => p.MarketId lubp => p.MarketId == marketId, expression.Body jest typuUnaryExpression. Dla tych ostatnichexpression.Body faktycznie zawiera{Convert((p.MarketId == 2))}.

Próba

var binaryExpression = expression as BinaryExpression;

zwracanull, co jest niefortunne, ponieważ sąLeft iRight właściwości, które mógłbym uznać za przydatne.

Czy ktoś wie, jak osiągnąć to, czego chcę? W dalszej części chciałbym móc wybraćOperator enum na podstawie przekazanego wyrażenia lambda. Każda pomoc byłaby bardzo doceniana.

questionAnswers(2)

yourAnswerToTheQuestion