有没有一种方法可以按名称查询DbSet的名称属性?

DSN

我们有许多包含用户ID属性的实体,我创建了一个自定义属性UserIdAttribute来注释那些模型。例如:

public class MyEntity
{
  [UserId]
  public Guid Owner { get; set; }
}

我们将有一个后台服务,其目的是在所有实体中查找用户ID属性,并对它们执行查找以填充另一个表。由于我们的模型/应用程序的状态不断变化,因此我们希望动态地找到这些值。我知道我可以达到Microsoft.Data.SqlClient以下目的:


var allUserIds = new List<Guid>();

foreach (var entityType in dbContext.Model.GetEntityTypes())
{
  foreach (var property in entityType.GetProperties())
  {
    foreach var attribute in property.PropertyInfo.GetCustomAttributes())
    {
      if (attribute is MyCustomAttribute)
      {
        //
        // do this using EF & reflection
        //
        using (var connection = new SqlConnection("my_conn_string"))
        {
          try
          {
            var tableName = entityType.GetTableName();
            var command = new SqlCommand(
              $"select {property.Name} from {tableName}",
              conn);
            conn.Open();
            var reader = command.ExecuteReader();
            while (reader.Read())
            {
              Console.WriteLine($"{entityType.ClrType.Name}.{property.Name}: {reader[property.Name]}");
            }
          }
          finally
          {
            conn.Close();
          }
        }
      }
    }
  }
}

PopulateUserInfoTable(allUserIds);

我们更喜欢在这里使用EF,问题是当我只有DbSet名称的字符串表示形式时,我看不到任何查询DbSet的方法。这甚至可以实现吗?

Svyatoslav Danyliv

实际上,没有任何不必要的数据库往返都是很容易的。LINQ非常酷。

var valuesQuery = CreateValuesQuery<Guid>(ctx, (e, p) => 
   p.PropertyInfo.GetCustomAttributes().Any(a => a is MyCustomAttribute));

if (valuesQuery != null)
{
   var userInfoQuery = 
      from ui in dbContext.UserInfoTable
      join v in valuesQuery on ui.UserId equals v
      select ui;

   var infoResut = userInfoQuery.ToList();
}

并实现:

public static IQueryable<T> CreateValuesQuery<T>(DbContext ctx, Func<IEntityType, IProperty, bool> filter)
{
    Expression query = null;
    IQueryProvider provider = null;
    var ctxConst = Expression.Constant(ctx);
    foreach (var entityType in ctx.Model.GetEntityTypes())
    {
        ParameterExpression entityParam = null;
        foreach (var property in entityType.GetProperties().Where(p => p.ClrType == typeof(T) && filter(entityType, p)))
        {
            entityParam ??= Expression.Parameter(entityType.ClrType, "e");
            var setQuery = Expression.Call(ctxConst, nameof(DbContext.Set), new[] {entityType.ClrType});
            provider ??= ((IQueryable) Expression.Lambda(setQuery).Compile().DynamicInvoke()).Provider;
            var propertyLambda = Expression.Lambda(Expression.MakeMemberAccess(entityParam, property.PropertyInfo), entityParam);
            var projection = Expression.Call(typeof(Queryable), nameof(Queryable.Select), new[]
                {
                    entityType.ClrType,
                    typeof(T)
                }, 
                setQuery, 
                propertyLambda
            );
            if (query != null)
                query = Expression.Call(typeof(Queryable), nameof(Queryable.Union), new []{typeof(T)}, query, projection);
            else
                query = projection;
        }
    }

    if (query == null)
        return null;

    return provider.CreateQuery<T>(query);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

有没有一种方法可以对setter方法和class属性使用相同的名称?

来自分类Dev

有没有一种方法可以更改占位符以仅读取模型的显示名称属性?

来自分类Dev

有没有一种方法可以在API网址中定义表名称

来自分类Dev

有没有一种方法可以在输出中组合名称空间?

来自分类Dev

有没有一种方法可以“合并”两列,其中新列的值是具有特定值的原始列的名称(按组)?

来自分类Dev

有没有一种方法可以定义具有不同名称的实现的函数?

来自分类Dev

有没有一种方法可以查询类是否包含具有某些已知名称的实例变量?

来自分类Dev

有没有一种方法可以在类名称与全局函数相同的方法中调用全局函数?

来自分类Dev

有没有一种方法可以确定Java中的应用程序服务器名称

来自分类Dev

有没有一种方法可以在Dockerfile中指定建议的标签名称?

来自分类Dev

有没有一种方法可以通过节点名称获取简单的XML子元素?

来自分类Dev

有没有一种方法可以防止MongoDB向集合名称添加复数形式?

来自分类Dev

有没有一种方法可以在宏中获取结构的字段名称?

来自分类Dev

有没有一种方法可以选择不直接引用其名称的表?

来自分类Dev

有没有一种方法可以将字段名称传递给setter函数?

来自分类Dev

有没有一种方法可以使用ElementTree注册多个名称空间

来自分类Dev

有没有一种方法可以只向r data.frame添加名称?

来自分类Dev

有没有一种方法可以使用动态字段名称构建类型接口?

来自分类Dev

有没有一种方法可以使用JS和AngularJS获取HTTP状态代码名称?

来自分类Dev

有没有一种方法可以比较哪个json响应的数组名称?

来自分类Dev

有没有一种方法可以在本地范围内为单例分配名称?

来自分类Dev

在JavaFX中,有没有一种方法可以先显示Tab名称,然后显示图形?

来自分类Dev

有没有一种方法可以让您找出正在调用的函数的哪个/名称?

来自分类Dev

有没有一种方法可以在Dockerfile中指定建议的标签名称?

来自分类Dev

有没有一种方法可以确定Java中的应用程序服务器名称

来自分类Dev

Rails:有没有一种方法可以将名称与每个语言环境相关联?

来自分类Dev

有没有一种方法可以从元素中获取ng-model的名称

来自分类Dev

有没有一种方法可以将对象名称动态传递给函数(作为参数)并使用参数引用该对象的属性?

来自分类Dev

有没有一种方法可以获取具有set方法的属性?

Related 相关文章

  1. 1

    有没有一种方法可以对setter方法和class属性使用相同的名称?

  2. 2

    有没有一种方法可以更改占位符以仅读取模型的显示名称属性?

  3. 3

    有没有一种方法可以在API网址中定义表名称

  4. 4

    有没有一种方法可以在输出中组合名称空间?

  5. 5

    有没有一种方法可以“合并”两列,其中新列的值是具有特定值的原始列的名称(按组)?

  6. 6

    有没有一种方法可以定义具有不同名称的实现的函数?

  7. 7

    有没有一种方法可以查询类是否包含具有某些已知名称的实例变量?

  8. 8

    有没有一种方法可以在类名称与全局函数相同的方法中调用全局函数?

  9. 9

    有没有一种方法可以确定Java中的应用程序服务器名称

  10. 10

    有没有一种方法可以在Dockerfile中指定建议的标签名称?

  11. 11

    有没有一种方法可以通过节点名称获取简单的XML子元素?

  12. 12

    有没有一种方法可以防止MongoDB向集合名称添加复数形式?

  13. 13

    有没有一种方法可以在宏中获取结构的字段名称?

  14. 14

    有没有一种方法可以选择不直接引用其名称的表?

  15. 15

    有没有一种方法可以将字段名称传递给setter函数?

  16. 16

    有没有一种方法可以使用ElementTree注册多个名称空间

  17. 17

    有没有一种方法可以只向r data.frame添加名称?

  18. 18

    有没有一种方法可以使用动态字段名称构建类型接口?

  19. 19

    有没有一种方法可以使用JS和AngularJS获取HTTP状态代码名称?

  20. 20

    有没有一种方法可以比较哪个json响应的数组名称?

  21. 21

    有没有一种方法可以在本地范围内为单例分配名称?

  22. 22

    在JavaFX中,有没有一种方法可以先显示Tab名称,然后显示图形?

  23. 23

    有没有一种方法可以让您找出正在调用的函数的哪个/名称?

  24. 24

    有没有一种方法可以在Dockerfile中指定建议的标签名称?

  25. 25

    有没有一种方法可以确定Java中的应用程序服务器名称

  26. 26

    Rails:有没有一种方法可以将名称与每个语言环境相关联?

  27. 27

    有没有一种方法可以从元素中获取ng-model的名称

  28. 28

    有没有一种方法可以将对象名称动态传递给函数(作为参数)并使用参数引用该对象的属性?

  29. 29

    有没有一种方法可以获取具有set方法的属性?

热门标签

归档