在一个C#
项目中,我希望能够创建一个函数,该函数接受IQuereable<User>
对象以及多个lambda表达式,然后将其转换为另一个对象。但是,我不想仅从数据库中提取所有可用的属性,而只希望提取提供给该函数的属性。我认为这是我需要遵循的逻辑
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仅选择表达式列表
答案 0 :(得分:0)
这可能是使用存储过程和动态SQL来构建初始查询并控制SELECT语句的内容的情况。
我看到的另一个选项是定义一个DTO对象,并利用AutoMapper Queryable Extensions并使用Explicit Expansion功能来控制数据返回。