【发布时间】:2019-03-04 19:52:56
【问题描述】:
在 C# 项目中,我希望能够创建一个函数,该函数接受 IQuereable<User> 对象以及多个 lambda 表达式,然后将其转换为不同的对象。但是,我不想从数据库中提取所有可用属性,而是只想提取提供给函数的属性。这是我认为我需要遵循的逻辑
- 弄清楚我需要选择哪些属性
- 通过指定所需的属性,从 IQueryable 构造一个 IEnumerable。
- 遍历每个选择的属性并创建
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<Func<User, T>>创建所需属性的匿名类,然后还传入Func<T, Student>将创建Student从它们。 -
如果您发布
User和Student分类会很有帮助。另外,您的keyProperty是否用于过滤User收藏? -
请展示调用函数的示例以及要在数组中传递的 lambda 类型。
标签: c# linq lambda linq-expressions