如何将类传递给函数生成表达式

时间:2019-03-25 16:43:50

标签: c# expression

我用

调用一个函数
find_package(wr3_moveit_plugin REQUIRED)

函数是

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等查询多个数据库,例如Person,因此我想要一个可以要求使用不同的数据库。

我知道我可以在函数调用中传递Product来替换typeof(Project)中的Project,但是我如何为{{ 1}}?

1 个答案:

答案 0 :(得分:2)

假设您的myLab02Entities1具有要查询的所有属性(ProjectsPersonsProducts等),可以执行以下操作:

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