Auseinanderziehen Ausdruck <Func <T, Objekt >>

Ich bin damit beschäftigt, Wrapper-Erweiterungsmethoden zu erstellenDapper undDapperExtensions. Im Moment versuche ich das zu filternGetList<T> Erweiterungsmethode, ähnlich wie bei LINQsWhere<T> Erweiterungsmethode. ich habe gesehendiese Frage aber anscheinend kann ich was nicht umsetzenSchlug Marc Gravell vor weil es keinen typ gibtEqualsExpression in .NET 4.5. Hier ist ein Demo-Code zur Erklärung meines Problems:

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);
        }
    }
}

Besonderes Augenmerk auf meineGet<T> Erweiterungsmethode: wenn ich beides übergebep => p.MarketId oderp => p.MarketId == marketId, expression.Body ist vom TypUnaryExpression. Für letztere,expression.Body tatsächlich enthält{Convert((p.MarketId == 2))}.

Versuch

var binaryExpression = expression as BinaryExpression;

kehrt zurücknull, was schade ist, weil es gibtLeft undRight Eigenschaften, die ich nützlich gefunden haben könnte.

Weiß jemand, wie man erreicht, was ich will? Weiter unten möchte ich in der Lage sein, das auszuwählenOperator enum basierend auf dem übergebenen Lambda-Ausdruck. Jede Hilfe wäre sehr dankbar.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage