4

所以我试图为 where 查询创建一个通用函数,而不是使用存储库,所以可以做这样的事情吗?

   public IEnumerable<T> Something<T>(int authorId) where T : class
    {
        return Vmsb.Set<T>().Where(c => c.AuthorId== authorId);

    }

现在我不能,因为它不知道 c.AuthorId 是什么

4

3 回答 3

3

创建一个接口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);
于 2013-04-05T23:13:52.947 回答
2

添加到Olexander 的答案中,因为 EF 建议您使用工作单元模式,所以我通常不会在我的方法中假设 DbContext - 我可能会传入最通用的对象。同样作为风格问题,我喜欢返回界面。

编辑更新以包括 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);

否则,您的“某事”方法不是非常灵活 - 它假定您当前对象上有一个现有的 DbContext,这可能不是一个安全的假设(因为它只应该在这一小块工作中存在,无论它是什么),您不能将其与其他命令等链接起来。

于 2013-04-05T23:30:24.923 回答
0

迭戈希望我的代码可以帮助你。

   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();
        }

    }
于 2013-10-17T13:07:32.397 回答