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.