如何使用列名列表作为字符串查询EF中的列?

时间:2013-05-22 18:46:06

标签: linq entity-framework

假设我有一个表,我可以使用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.
    }

保持返回的记录值强类型非常重要,这意味着不能将值转储到字符串列表中。这是可以用反射完成的吗?或者仿制药会更好地适应这种情况吗?老实说,我不知道从哪里开始。

感谢您的帮助。

1 个答案:

答案 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>)

你也可以通过动态编写你想要选择的列的表达式树来做到这一点,但这将是更多的代码。