假设我有一个表,我可以使用EF + LINQ查询:
var results = dbContext.MyTable.Where(q => q.Flag = true);
然后,我知道如果我想限制返回的列,我可以在这行中添加一个select:
var results = dbContext.MyTable
.Select(model => new { model.column2, model.column4, model.column9 })
.Where(q => q.Flag == true);
我需要弄清楚的下一步是如何动态选择这些列。换句话说,我需要能够在不知道编译时它们是什么的情况下选择表中的列。所以,例如,我需要能够做到这样的事情:
public IEnumerable<object> GetWhateverColumnsYouWant(List<string> columns = new List<string{ "column3", "column4", "column999"})
{
// automagical stuff goes here.
}
保持返回的记录值强类型非常重要,这意味着不能将值转储到字符串列表中。这是可以用反射完成的吗?或者仿制药会更好地适应这种情况吗?老实说,我不知道从哪里开始。
感谢您的帮助。
答案 0 :(得分:0)
我想你想要一些动态的linq,我不是这方面的专家,但我认为它会是这样的
public static IEnumerable<object> GetWhateverColumnsYouWant(this IQueriable<T> query, List<string> columns = new List<string{ "column3", "column4", "column999"})
{
return query.Select("new (" + String.Join(", ", columns) + ")");
}
请参阅scott Gu的博客http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx以及此问题System.LINQ.Dynamic: Select(" new (...)") into a List<T> (or any other enumerable collection of <T>)
你也可以通过动态编写你想要选择的列的表达式树来做到这一点,但这将是更多的代码。