按字符串名称查询?

时间:2016-09-28 19:27:01

标签: c# entity-framework-6 odata

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

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

2 个答案:

答案 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.ModelsDataAccess.Entitites,它就应该有用。

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