实体框架,通用列表

时间:2012-02-22 18:54:35

标签: c# asp.net entity-framework-4

我对通用列表有疑问。

假设我有一个包含三个表的数据库,User表,Order表和Item表。

在C#代码中,我想要一个名为GetList的函数来从三个表中的一个表中获取所有记录。

如果我不使用泛型方法,我必须创建3个不同的方法,看起来像GetAllUsers(),GetAllOrders()和GetAllItems()。在这3个方法中,我将编写linq来查询数据库。

我的问题是如何实现通用方法。

我想使用EF 4.1。我知道如何使用NHibrate来做到这一点。

更新

这个怎么样?我从另一篇文章中找到了它,它可以用来获得一个单独的记录

        public T GetSingleEntity<T>(Expression<Func<T,bool>> expression) where T:class
    {
        using (PersonalLinksEntities dbContext = new PersonalLinksEntities()) 
        {
            return dbContext.CreateObjectSet<T>().SingleOrDefault(expression);
        }

    }

PersonalLinksEntities由EF生成,它是数据库的第一个模型。

以下是我称之为此方法的方法

    public ActionResult Index()
    {
        var thisOne = base.GetSingleEntity<PersonalRecord>(r=>r.RecordID==1);            
        return View();
    }

3 个答案:

答案 0 :(得分:1)

具体实施取决于您用于访问数据的内容。 NHib,EF,L2S?这些都有一些通用的方式来访问IQueryable。

您可以公开一个方法,例如:

public IQueryable<T> GetQueryable<T>()
{
   //Implementation depends on your data provider
   //return dataContext.GetTable<T>();
   //return session.Query<T>();
}

但您可能想要做的是遵循存储库模式,为每种类型使用不同的存储库。但是您可以使用接受类型参数且可重用的抽象基础存储库。

public abstract class RepositoryBase<T>
{
   public IQueryable<T> GetQuery()
   {
     //Implementation determined by provider
    }

}

答案 1 :(得分:0)

由于问题中没有关于你已经写过的内容的细节。如果你只想从表中获取所有记录......为什么LINQ ......?您可以在方法中使用数据集和数据适配器简单地查询数据库,并使该通用只需传递表名并返回数据集,之后您可以根据需要使用该数据集。如果我在这个案例中有任何具体的复杂性,请详细说明。

答案 2 :(得分:0)

在DbContext中已经存在您想要的方法,称为Set,例如var results = dbContext.Set();

如果您使用的是ObjectContext,那么您需要的方法是CreateObjectSet()。