如何声明DbSet <dynamic>?

时间:2017-12-28 15:34:25

标签: asp.net-mvc entity-framework entity-framework-core

我试图在我的数据库上下文类中声明DbSet。 因为我没有用户调用哪个类(Entity Framwork Class)。 这就是我想用动态声明DbSet的原因。

1 个答案:

答案 0 :(得分:0)

我会尝试在您的上下文中明确定义所有内容。该属性声明中包含了许多功能,其中最重要的是具有类型的设计时优势。

有许多动态查询技术,但我会发布过去曾用过的动态查询表。

public List<LookupItemDTO> LoadItems(int lookupId)
{
    //nothing special here, just map the lookup id to a name
    var lookupRepo = new LookupRepository<LookupDefinition>(uow);
    var lookup = lookupRepo.Find(id);

    //map the lookup's name from the table to a type. This is important DO NOT ACCEPT A TABLE NAME FROM THE USER.
    var targetType = Type.GetType("MyApp.DomainClasses.Lookup." + lookup.Name + ",MyApp.DomainClasses");
    // this is an optional extra step but it allows us to instantiate an instance of our repository to ensure that business rules are enforced
    var lookupType = typeof(LookupRepository<>).MakeGenericType(targetType);
    dynamic LookupTable = Activator.CreateInstance(lookupType);
    //just some pattern nonsense to wire up the unit of work
    LookupTable.SetupUOW(uow);

    //make sure to cast it into something you can work with ASAP
    var data = ((IQueryable<LookupTableBase>)LookupTable.All).OrderByDescending(l => l.IsVisible).ThenBy(l => l.SortOrder);

    var list = from li in data
               select new LookupItemDTO
               {
                   Id = li.Id,
                   Description = li.Description,
                   Display = li.Display,
                   SortOrder = li.SortOrder,
                   IsVisible = li.IsVisible
               };

    return list.ToList();
}

这里的关键是你可以动态查询表格,但最好在更高层次上进行查询。此外,在您和用户的输入之间存在某种间接性。让他们从列表中选择一个表,使用该表中的ID来查找名称。我的解决方案是有一个查找表定义表。任何动态查询都从首先开始,然后使用该定义表中的值来构建必要的类型。