我正在寻找实体框架中DataContext.GetTable<TEntity>
的等价物。
我找到了ObjectContext.CreateQuery<T>
方法,但它与DataContext.GetTable<TEntity>
不同,因为它需要一个查询字符串才能工作。
有没有办法在不指定查询字符串的情况下使用实体类型为表获取IQueryable对象?
*EDIT: Added code snippet*
这是我实现的与linq2sql一起使用的Repository类的片段。我不能使用ObjectContext.[TableName]
,因为它不再是通用的。
public class BaseRepository<TClass> : IDisposable
where TClass : class
{
protected BaseRepository(DataContext database)
{
_database = database;
}
...
public IQueryable<TClass> GetAllEntities()
{
IQueryable<TClass> entities = _database.GetTable<TClass>();
return entities;
}
public IQueryable<TClass> GetEntities(Expression<Func<TClass, bool>> condition)
{
IQueryable<TClass> table = _database.GetTable<TClass>();
return table.Where(condition);
}
*EDIT: Added my solution (so far..)*
这就是我正在使用的:
public IQueryable<TClass> GetEntities(Expression<Func<TClass, bool>> condition)
{
IQueryable<TClass> table = _database.CreateQuery<TClass>(typeof(TClass).Name);
return table.Where(condition);
}
只要类名与表名相同,这就有效。当我开始在同一张桌子上使用不同的对象时,这对我来说会成为一个问题。
我希望我已经清楚了,先谢谢, 马可:)
答案 0 :(得分:6)
实际上,EF设计者本身使用CreateQuery
的硬编码字符串作为静态引用。如果你深入了解设计器文件,你会看到类似这样的东西:
public global::System.Data.Objects.ObjectQuery<Customers> Customers
{
get
{
if ((this._Customers == null))
{
this._Customers = base.CreateQuery<Customers>("[Customers]");
}
return this._Customers;
}
}
private global::System.Data.Objects.ObjectQuery<Customers> _Customers;
从技术上讲,没有完美的解决方案,因为您可以为不同的实体集使用相同的实体类型。但是你可以给它一个旧的大学尝试:
public IQueryable<TEntity> GetEntities<TEntity>()
{
Type t = typeof(TEntity);
var edmAttr = (EdmEntityTypeAttribute)Attribute.GetCustomAttribute(t,
typeof(EdmEntityTypeAttribute), false);
if (edmAttr == null) // Fall back to the naive way
{
return context.CreateQuery<TEntity>(t.Name);
}
var ec = context.MetadataWorkspace.GetEntityContainer(
context.DefaultContainerName, DataSpace.CSpace);
var entityType = context.MetadataWorkspace.GetType(edmAttr.Name,
edmAttr.NamespaceName, DataSpace.CSpace);
var es = ec.BaseEntitySets.First(es => es.ElementType == entityType);
return context.CreateQuery<TEntity>(es.Name);
}
答案 1 :(得分:1)
public IQueryable GetTable<T>(T entity) where T : class
{
return context.CreateObjectSet<T>();
}
答案 2 :(得分:0)
我希望我不会错过这一点,但不会错过:
ObjectContext.TableName
其中TableName是您要使用的类型的EntitySet。