0

假设我有一个可以使用 EF + LINQ 查询的表,如下所示:

    var results = dbContext.MyTable.Where(q => q.Flag = true);

然后,我知道如果我想限制返回的列,我可以在该行中添加一个选择,如下所示:

    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.
    }

保持返回的记录值是强类型很重要,这意味着不能将这些值转储到字符串列表中。这是可以通过反思来完成的吗?还是泛型更适合这个?老实说,我不知道从哪里开始。

谢谢你的帮助。

4

1 回答 1

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和这个问题系统.LINQ.Dynamic: Select("new (...)") 到 List<T> (或任何其他可枚举的 <T> 集合)

您可能还可以通过动态组合要选择的列的表达式树来做到这一点,但这实际上需要编写更多代码。

于 2013-05-22T23:10:59.267 回答