2016-09-28 84 views
0

有没有办法通过实体的字符串名称查询实体框架?目前,我通过使用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>() 

但我不能因为应用程序只传递实体的字符串名称。

回答

1

DbContext可以基于提供的type创建DbSet。并且可以从string创建type。所以如果你知道实体的名字,你应该可以这样做:

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.ModelsDataAccess.Entitites,它应该可以工作。

另请注意,这将查询整个表并提取所有行。这可能是或者可能不是,就是你想要的。您可能还想在某处放置DbContext

+0

这正是我所期待的!它完美无缺地工作:) – jjf1978

1

您可以使用以下convension在EF写自己的查询:

using (var context = new BloggingContext()) 
{ 
    var blogNames = context.Database.SqlQuery<string>( 
         "SELECT Name FROM dbo.Blogs").ToList(); 
} 

但你是,如果你想生成动态查询使用小巧精致的东西,我强烈建议。它做了类似的事情,但速度更快。你可以阅读更多关于dapper here

+0

我没有考虑执行sql查询字符串。但是,考虑到我们有300多个具有复杂关系的表,我不认为这是可行的(但不是不可能)为每个实体生成查询。我会研究Dapper,谢谢! – jjf1978