我试图在我的数据库上下文类中声明DbSet。 因为我没有用户调用哪个类(Entity Framwork Class)。 这就是我想用动态声明DbSet的原因。
答案 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来查找名称。我的解决方案是有一个查找表定义表。任何动态查询都从首先开始,然后使用该定义表中的值来构建必要的类型。