【问题标题】:IQueryable: Project columns by their names in linq dynamically at runtimeIQueryable:在运行时动态地在 linq 中按名称投影列
【发布时间】:2017-10-14 12:43:11
【问题描述】:

我有一个 Dictionary<string, string> Fields,其中包含 propertyNamesproperty Types

我有一个查询对象:IQueryable<T> query = GetQuery();

我正在使用Typebuilder根据Fields字典动态构建类型:

TypeBuilder builder = CreateTypeBuilder("MyDynamicAssembly", "MyModule", "MyType");

DataTable dt = new DataTable();

foreach (var s in Fields)
{
   CreateAutoImplementedProperty(builder, s.Key, Type.GetType(s.Value));
   dt.Columns.Add(s.Key, Type.GetType(s.Value));
}

Type resultType = builder.CreateType();

我想使用linq 修改查询对象以仅投影其名称在Fields 字典中的列。比如:

dynamic queryResult = query.Take(10).Select("Don't know how to project here???");

考虑列名是:

string[] columnsNames = Fields.Select(x => x.Key).ToArray();

我该怎么做?

【问题讨论】:

  • 如果显示一些示例数据和输出会更容易理解
  • 因为您是在运行时动态构建查询,所以您需要动态构建表达式树。你可以使用这个库来帮助解决这个问题:dynamiclinq.codeplex.com/documentation
  • @Gilad Green 我添加了更多信息
  • string[] columnsNames = Fields.Select(x => x.Key).ToArray(); string columns = string.Join(",", columnsNames); dynamic queryResult = query.Take(10).Select("new (" + columns + ")");
  • 您可以使用我的示例代码尝试该库。 .Select 是该库的扩展方法。请让我知道它是否有效。

标签: c# entity-framework linq lambda linq-to-entities


【解决方案1】:

因为您是在运行时动态构建查询,所以您需要动态构建表达式树。你可以使用这个库来帮助解决这个问题:https://dynamiclinq.codeplex.com/

在您的情况下,您可以像这样动态构建 .Select 子句:

string[] columnsNames = Fields.Select(x => x.Key).ToArray();

string columns = string.Join(",", columnsNames);

dynamic queryResult = query.Take(10).Select("new (" + columns + ")");

上面的.Select 是该库的扩展方法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多