如何从C#中的Lambda表达式列表构造IEnumerable?

时间:2019-03-04 19:52:56

标签: c# linq lambda linq-expressions

在一个C#项目中,我希望能够创建一个函数,该函数接受IQuereable<User>对象以及多个lambda表达式,然后将其转换为另一个对象。但是,我不想仅从数据库中提取所有可用的属性,而只希望提取提供给该函数的属性。我认为这是我需要遵循的逻辑

  1. 弄清楚我需要选择哪些属性
  2. 通过指定所需的属性从IQueryable构造IEnumerable。
  3. 遍历所选的每个属性并创建Student对象。

换句话说,如果我在.ToList()对象上调用IQuereable<User> users,则查询将从数据库表中选择*,该表将拉出所有可用的列。相反,我只想选择作为Labda表达式传递的属性。

这是我的代码

public IEnumerable<Student> Make(IQuereable<User> users, Expression<Func<User, dynamic>> keyProperty, params Expression<Func<User, dynamic>>[] propertiesToSelect)
{
    var students = new List<Student>();

    // Make a distinct list of lambda's expressions that I need to select
    var props = propertiesToSelect.ToList();
    props.Add(keyProperty);

    props = props.Distinct().ToList();

    // TO DO!!! Some how, I need to only select the properties that are in **props** array insted of pulling all available properties
    var selectableUsers = users.Select(/**/).ToList();

    foreach(var user in selectableUsers)
    {
        var student = new Student();

        foreach(Expression<Func<User, object> exp in props)
        {
            var prop = GetPropertyInfo(user, exp)
            object value = prop.GetValue(user, null);
            // Set the property student property
            // Do somthing with prop.Name...
            // Do something with value...
        }

        students.Add(student);
    }

    return strudents;
}

问题:如何使用LINQ仅选择表达式列表

1 个答案:

答案 0 :(得分:0)

这可能是使用存储过程和动态SQL来构建初始查询并控制SELECT语句的内容的情况。

我看到的另一个选项是定义一个DTO对象,并利用AutoMapper Queryable Extensions并使用Explicit Expansion功能来控制数据返回。