有没有办法通过实体的字符串名称查询实体框架?目前,我通过使用Entity Framework实现WCF OData服务来实现这一目标。我构建URI并针对DbContext执行它(请参阅下面的当前实现)。这适用于简单的实体,但任何具有大量导航属性和数千条记录的复杂实体都会使IIS工作进程崩溃并导致内存异常。
当前实施:
public static IEnumerable<object> GetList(string entityName)
{
Uri dataAccessURI = New Uri(string.Format("https://MyServer/Service.svc/{0}", entityName))
result = DbContext.Execute<object>(dataAccessURI , "GET", true);
return result;
}
我只能按实体名称完成保存,查询怎么办?
db.AddObject(entityName, record);
db.SaveChanges();
注意:我不能使用泛型。我希望能够使用像
这样的东西public static DbSet<TEntity> GetList<TEntity>()
但我不能,因为应用程序只传递了实体的字符串名称。
答案 0 :(得分:1)
您可以使用EF中的以下内容编写自己的查询:
let obj = {};
obj[attribute] = value;
但我强烈建议您使用Dapper,如果您想生成动态查询。它做了类似的事情,但速度更快。您可以阅读有关dapper here的更多信息。
答案 1 :(得分:1)
DbContext
可以根据提供的DbSet
创建type
。可以从type
创建string
。因此,如果你知道实体的名称,你应该能够做到这样的事情:
public static IEnumerable<object> GetList(string entityName)
{
Type entityType = Type.GetType(string.format("Namespace.{0}, MyAssembly", entityName);
DbSet dbSet = DbContext.Set(entityType);
// DbSet implements IEnumerable, so you will be able to safely cast it like so.
// Or you can assign it to IEnumerable directly.
IEnumerable list = dbSet as IEnumerable;
return list.Cast<object>.ToList();
}
这不是最漂亮的解决方案。但它的确有效。我不知道对性能的影响。
您需要知道实体的名称空间,这有明显的缺点。但只要您的所有实体都在同一名称空间中,例如DataAccess.Models
或DataAccess.Entitites
,它就应该有用。
另请注意,这将查询整个表并获取所有行。这可能是,也可能不是,是您想要的。您可能还想在某处处置DbContext
。