Как передать класс в функцию генерации выражения - PullRequest
0 голосов
/ 25 марта 2019

Я вызываю функцию с

uniqueItems = _distinctDao.GetProjectsFromDb(c.colName);

, а функция является

    public List<string> GetProjectsFromDb(string columnName)
    {
        ParameterExpression parameter = Expression.Parameter(typeof(Project), "x");

        var lambda = Expression.Lambda(Expression.Property(parameter, columnName), parameter);
        Expression<Func<Project, string>> funcExpression = (Expression<Func<Project, string>>) lambda;

        using (var mLEntities = new myLab02Entities1())
        {
            var cl = mLEntities.Projects.AsQueryable().Select(funcExpression).Distinct(); 

            List<string> searchRes = cl.AsEnumerable().ToList();

            return searchRes;
        }
    }

Это работает, как и ожидалось, но мне нужно запросить несколько баз данных как Project s в примерекак Person s, Product s и т. д., поэтому я хочу одну функцию, которая может быть вызвана для разных баз данных.

Я знаю, что могу передать typeof(Project) в вызове функции для замены Projectв ParameterExpression, но как я могу передать класс (Project) для Expression<Func<Project, string>>?

1 Ответ

2 голосов
/ 25 марта 2019

Предполагая, что ваш myLab02Entities1 имеет все свойства, которые вы хотите запросить (Projects, Persons, Products и т. Д.), Вы можете сделать это:

public List<string> GetObjectsFromDb<T>(string columnName, Func<myLab02Entities1, IEnumerable<T>> entitySelector)
{
    ParameterExpression parameter = Expression.Parameter(typeof(T), "x");

    var lambda = Expression.Lambda(Expression.Property(parameter, columnName), parameter);
    Expression<Func<T, string>> funcExpression = (Expression<Func<T, string>>) lambda;

    using (var mLEntities = new myLab02Entities1())
    {
        var cl = entitySelector(mLEntities).AsQueryable().Select(funcExpression).Distinct(); 

        List<string> searchRes = cl.AsEnumerable().ToList();

        return searchRes;
    }
}

Я в основном добавилуниверсальный параметр T и новый параметр entitySelector, который возвращает соответствующее свойство в myLab02Entities1.Вы можете применить более строгое общее ограничение к T, если хотите.

Использование:

GetObjectsFromDb("someColumn", x => x.Projects);
GetObjectsFromDb("someColumn", x => x.Persons);
GetObjectsFromDb("someColumn", x => x.Products);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...