IQueryable:在运行时在 linq 中按列的名称动态投影列



我有一个包含属性名称和属性类型的Dictionary<string, string> Fields

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

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

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();

我该怎么做?

由于要在运行时动态生成查询,因此需要动态生成表达式树。您可以使用此库来帮助实现: 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是该库中的扩展方法

最新更新