Создать универсальный селектор для Select () при использовании Entity Framework - PullRequest
2 голосов
/ 27 июня 2019

Я хотел бы создать функцию для получения списка типа данного имени свойства.Но я пока не знаю, как создать работающий лямбда-селектор.

public IList<object> GetDistinctListOfProperty(string propertyName)
{
    var propInfoByName = typeof(T).GetProperty(propertyName);
    if (propInfoByName == null) return new List<object>();

    using (var db = new ApplicationDbContext())
    {
        var lambda = //TODO
        return db.Set<T>().Select(lambda).Distinct().ToList();
    }
}

Ответы [ 2 ]

4 голосов
/ 27 июня 2019

Вы можете использовать этот метод для генерации лямбда

public static Expression<Func<T, object>> LambdaGenerator<T>(string propertyName)
    {
        var arg = Expression.Parameter(typeof(T), "current");
        var property = Expression.Property(arg, propertyName);
        var conv = Expression.Convert(property, typeof(object));
        var exp = Expression.Lambda<Func<T, object>>(conv, new ParameterExpression[] { arg });
        return exp;
    }

, а затем используйте этот метод для создания выражения

var lambda = LambdaGenerator<T>("Your Property Name");
2 голосов
/ 27 июня 2019

Вы можете использовать выражение для этого:

private IList<Tout> GetDistinctListOfProperty<Ttable, Tout>(Expression<Func<Ttable, Tout>> returnField) where Ttable : class
{
    using (var db = new ApplicationDbContext())
    {
        return db.Set<Ttable>().Select(returnField).Distinct().ToList();
    }
}

Вам нужно заключить Func в Expression, чтобы сущность могла перевести его в действительный sql.Эта версия позволяет вам использовать intellisense при выборе вашего параметра.Вы бы назвали это так:

var result = GetDistinctListOfProperty<YourTableType>(x => x.YourProperty);

Эта версия будет работать на каждой таблице, известной вашему ApplicationDbContext

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...