实体框架和DbSet
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实体框架和DbSet相关的知识,希望对你有一定的参考价值。
我正在尝试设置一个通用接口来从存储库中检索实体。问题是我需要从WCF服务请求数据,而Generics不能使用操作合同,我可以看到。
所以我有一个在控制台应用程序中工作,而不是使用服务调用:
public virtual List<T> GetAll<T>() where T : MyBaseType
{
return this.datacontext.Set<T>().Include(l => l.RelationshipEntity).ToList();
}
我能看到这个的唯一方法是:
public virtual List<MyBaseType> GetAll(Type entityType)
{
return this.datacontext.Set(entityType).Include(l => l.RelationshipEntity).ToList();
}
Set<T>()
和Set(Type type)
都返回DbSet
但是,Set(Type type)
没有使用ToList()
的扩展,也没有得到我的所有结果。
Local
属性仅显示当前执行范围内的上下文,而不显示存储库中包含的内容。
所以我想要这样的WCF合同:
[ServiceContract]
public interface IRulesService
{
[OperationContract]
MyBaseType Add(MyBaseType entity);
[OperationContract]
List<MyBaseType> GetAll(Type type);
}
然后执行:
public virtual List<MyBaseType> GetAll(Type entityType)
{
var dbset = this.datacontext.Set(entityType);
string sql = String.Format("select * from {0}s", type.Name);
Type listType = typeof(List<>).MakeGenericType(entityType);
List<MyBaseType> list = new List<MyBaseType>();
IEnumerator result = dbset.SqlQuery(sql).GetEnumerator();
while (result.MoveNext()){
list.Add(result.Current as MyBaseType);
}
return list;
}
//public virtual List<T> GetAll<T>() where T : MyBaseType
//{
// return this.datacontext.Set<T>().Include(l => l.RelationshipEntity).ToList();
//}
public virtual MyBaseType Add(MyBaseType entity)
{
DbSet set = this.datacontext.Set(typeof(entity));
set.Add(entity);
this.datacontext.SaveChanges();
return entity;
}
//public virtual T Add<T>(T t) where T : MyBaseType
//{
// this.datacontext.Set<T>().Add(t);
// this.datacontext.SaveChanges();
// return t;
//}
public virtual List<MyBaseType> UpdateAll(List<MyBaseType> entities)
{
}
任何想法最好的方法?
答案
你应该能够调用Cast<T>
扩展方法。
public virtual List<MyBaseType> GetAll(Type entityType)
{
return this.datacontext.Set(entityType)
.Include(l => l.RelationshipEntity)
.Cast<MyBaseType>() // The magic here
.ToList();
}
以上是关于实体框架和DbSet的主要内容,如果未能解决你的问题,请参考以下文章
实体框架:Count() 在大型 DbSet 和复杂的 WHERE 子句上非常慢