用于Where查询的通用DBContext
本文关键字:DBContext Where 查询 用于 | 更新日期: 2023-09-27 18:07:33
所以我试图为一个查询的通用函数,不使用存储库所以这样做是可能的?
public IEnumerable<T> Something<T>(int authorId) where T : class
{
return Vmsb.Set<T>().Where(c => c.AuthorId== authorId);
}
现在我不能因为它不知道c。authorid是什么
创建一个接口IHaveAuthor
,并通过以下属性在部分类上指定它:
public interface IHaveAuthor
{
int AuthorId { get; set; }
}
//Note that the interface is already implemented in auto-generated part.
//Or if it's Code First, just specify it directly on your classes.
public partial class Book : IHaveAuthor
{
}
public partial class Article : IHaveAuthor
{
}
然后指向泛型where
约束下的接口:
public IEnumerable<T> GetAuthorPublicationsOf<T>(int authorId)
where T : class, IHaveAuthor
{
return Vmsb.Set<T>().Where(c => c.AuthorId == authorId);
}
和用法:
var authorBooks = query.GetAuthorPublicationsOf<Book>(authorId);
var authorArticles = query.GetAuthorPublicationsOf<Article>(authorId);
补充一下Olexander的回答,因为EF建议您使用工作单元模式,所以我通常不会在我的方法中假设DbContext—而是传递最通用的对象。同样出于风格的考虑,我喜欢返回接口。
EDIT更新,包括Olexander使用IQueryable而不是IEnumerable的重要修复。
所以我的方法签名是这样的:
public IQueryable<IHaveAuthor> Something(int authorId, IQueryable<IHaveAuthor> items)
{
return items.Where(c => c.AuthorId == authorId);
}
所以调用这个会和你现在对它的调用有点不同——大概是这样的:
var db = new MyDbContext();
var items = db.Books;
var itemForAuthor1 = Something(1, items);
否则你的"Something"方法就不是很灵活了——它假设当前对象上存在一个单独的DbContext,这可能不是一个安全的假设(因为它只应该在这一小块工作中存在,不管它是什么),你不能将它与其他命令链接在一起,等等。
希望我的代码对你有所帮助。
protected List<T> ListAll<T>() where T : class
{
using (MyDbContext db = new MyDbContext ())
{
return db.Set(typeof(T)).Cast<T>().AsNoTracking<T>().ToList();
}
}
protected T ListAllById<T>(int id) where T : class
{
using (MyDbContext db = new MyDbContext ())
{
return db.Set(typeof(T)).Cast<T>().Find(id);
}
}
protected void InsertObj(Object obj)
{
using (MyDbContext db = new MyDbContext())
{
db.Set(obj.GetType()).Add(obj);
db.SaveChanges();
}
}
protected void UpdateObj(Object obj)
{
try
{
using (MyDbContext db = new MyDbContext())
{
db.Set(obj.GetType()).Attach(obj);
db.Entry(obj).State = EntityState.Modified;
db.SaveChanges();
}
}
catch (System.Exception ex)
{
System.Windows.Forms.MessageBox.Show(" " + ex.Message);
}
}
protected void DeleteObj(Object obj)
{
using (MyDbContext db = new MyDbContext ())
{
db.Set(obj.GetType()).Attach(obj);
db.Entry(obj).State = EntityState.Deleted;
db.SaveChanges();
}
}