generics - 在 .NET Core 中使用字段名动态构建 IQueryable Select 子句

标签 generics select lambda iqueryable

我想扩展我的 IQueryable 以获取字段名列表,并且只将这些列返回到动态集合中。本质上,我想通过传入的字段/列名称来实现“选择”。该方法看起来像这样:

private IQueryable<TEnity> SetSelect(IQueryable<TEntity> query, List<string> fieldnames)
{
  //Build up the Expression  here
  query = query.Select(expressionHere);
  return query;
}

所以如果我正在查询像这样的对象:

public Class Dog
{
  int Id{get;set;}
  string Name{get;set;}
  string Color{get;set;}
  DateTime Birthdate{get;set;}
}

但我只想获取姓名和出生日期我可以通过调用 SetSelect(query, new List<string>{"Name", "Birthdate"}); 来扩展 IQueryable

并会返回:

[{"Fido", 01-01-2017}, {"Spot", 05-04-1972}]

有没有人做过类似的事情,可以帮助我构建那个表达式?

感谢任何澄清。

注意:这是一个 .Net Core 应用程序

最佳答案

您可以通过调用 DynamicSelectGenerator 从实体中选择来生成动态选择。

public static Func<T, T> DynamicSelectGenerator<T>( string fields )
          {
            // get Properties of the T
            var fields = typeof(T).GetProperties().Select(propertyInfo => propertyInfo.Name).ToArray();

            // input parameter "o"
            var xParameter = Expression.Parameter(typeof(T), "o");

            // new statement "new Data()"
            var xNew = Expression.New(typeof(T));

            // create initializers
            var bindings = fields.Split( ',' ).Select(o => o.Trim())
                .Select(o =>
                {

                    // property "Field1"
                    var mi = typeof(T).GetProperty(o);

                    // original value "o.Field1"
                    var xOriginal = Expression.Property(xParameter, mi);

                    // set value "Field1 = o.Field1"
                    return Expression.Bind(mi, xOriginal);
                }
            );

            // initialization "new Data { Field1 = o.Field1, Field2 = o.Field2 }"
            var xInit = Expression.MemberInit(xNew, bindings);

            // expression "o => new Data { Field1 = o.Field1, Field2 = o.Field2 }"
            var lambda = Expression.Lambda<Func<T, T>>(xInit, xParameter);

            // compile to Func<Data, Data>
            return lambda.Compile();
        }

例如使用这段代码:

var result = dbContextInstancs.EntityClass.Select(DynamicSelectGenerator<EntityClass>("Name", "Birthdate"));

关于generics - 在 .NET Core 中使用字段名动态构建 IQueryable Select 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42820866/

相关文章:

swift - 任何类型的可选扩展

c# - 为什么非无参数构造函数仍然可以?

swift - 将@IBInspectable 与 Storyboard中的任何 UIView 子类一起使用

mysql - 如何使用 sql 选择值作为数组?

jpa - 使用 JPA Criteria API 的 select 子句中的子查询

r - 如何选择可能存在或可能不存在的列?

lambda - 以标签作为参数的 F# 函数

java - 奇怪的 ClassCastException

lambda - 在 Web2py 中使用 lambda 作为模型默认值

c# - 使用 List<T> 测试 List<T> 成员资格