【问题标题】:How to construct IEnumerable from a list of lambda expression in c#?如何从 c# 中的 lambda 表达式列表构造 IEnumerable?
【发布时间】:2019-03-04 19:52:56
【问题描述】:

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

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

换句话说,如果我在IQuereable<User> users 对象上调用.ToList(),查询将从提取所有可用列的数据库表中选择*。相反,我只想选择作为 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 仅选择表达式列表

【问题讨论】:

  • 您可以使该方法成为通用方法,并使用 Expression&lt;Func&lt;User, T&gt;&gt; 创建所需属性的匿名类,然后还传入 Func&lt;T, Student&gt; 将创建 Student 从它们。
  • 如果您发布 UserStudent 分类会很有帮助。另外,您的keyProperty 是否用于过滤User 收藏?
  • 请展示调用函数的示例以及要在数组中传递的 lambda 类型。

标签: c# linq lambda linq-expressions


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    • 2013-05-24
    • 2015-09-06
    相关资源
    最近更新 更多