C# 实体框架,通用列表

C# 实体框架,通用列表,c#,asp.net,entity-framework-4,C#,Asp.net,Entity Framework 4,我有一个关于通用列表的问题 假设我有一个数据库,它包含三个表:用户表、订单表和项目表 在C#代码中,我需要一个名为GetList的函数来从三个表中的一个表中获取所有he记录 如果我不使用泛型方法,我必须创建3个不同的方法,它们看起来像GetAllUsers()、GetAllOrders()和GetAllItems()。在这3个方法中,我必须编写linq来查询数据库 我的问题是如何实现通用方法 我想使用EF4.1。我知道如何使用NHibrate-tho 更新 这个怎么样?我从另一个帖子里找到的,它

我有一个关于通用列表的问题

假设我有一个数据库,它包含三个表:用户表、订单表和项目表

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

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

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

我想使用EF4.1。我知道如何使用NHibrate-tho

更新

这个怎么样?我从另一个帖子里找到的,它可以用来获得一张唱片

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

    }
public T GetSingleEntity(表达式),其中T:class
{
使用(PersonalLinkSenties dbContext=new PersonalLinkSenties())
{
返回dbContext.CreateObjectSet().SingleOrDefault(表达式);
}
}
PersonalLinkSenties由EF生成,它是数据库优先模型

以下是我如何调用此方法的方法

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

因为问题中没有关于您已经编写的内容的详细信息。如果您只想从表中获取所有记录…为什么要LINQ。。。??您可以在一个方法中使用数据集和数据适配器简单地查询数据库,为了使其通用,您只需传递表名并返回一个数据集,然后就可以随心所欲地使用该数据集。如果在这个案例中我遗漏了任何具体的复杂性,请详细说明。

因为问题中没有关于您已经写了什么的细节。如果您只想从表中获取所有记录…为什么要LINQ。。。??您可以在一个方法中使用数据集和数据适配器简单地查询数据库,为了使其通用,您只需传递表名并返回一个数据集,然后就可以随心所欲地使用该数据集。如果在本例中我遗漏了任何具体的复杂性,请详细说明。

具体的实现将取决于您使用什么来访问数据。NHib,EF,L2S?这些都有一些方法可以访问IQueryable

您可以公开以下方法:

public IQueryable<T> GetQueryable<T>()
{
   //Implementation depends on your data provider
   //return dataContext.GetTable<T>();
   //return session.Query<T>();
}
public IQueryable GetQueryable()
{
//实现取决于您的数据提供者
//返回dataContext.GetTable();
//返回session.Query();
}
但您可能想做的是遵循存储库模式,为每种类型使用不同的存储库。但您可以使用接受类型参数且可重用的抽象基础存储库

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

}
公共抽象类RepositoryBase
{
公共IQueryable GetQuery()
{
//由提供程序确定的实现
}
}

具体的实现取决于您使用什么来访问数据。NHib,EF,L2S?这些都有一些方法可以访问IQueryable

您可以公开以下方法:

public IQueryable<T> GetQueryable<T>()
{
   //Implementation depends on your data provider
   //return dataContext.GetTable<T>();
   //return session.Query<T>();
}
public IQueryable GetQueryable()
{
//实现取决于您的数据提供者
//返回dataContext.GetTable();
//返回session.Query();
}
但您可能想做的是遵循存储库模式,为每种类型使用不同的存储库。但您可以使用接受类型参数且可重用的抽象基础存储库

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

}
公共抽象类RepositoryBase
{
公共IQueryable GetQuery()
{
//由提供程序确定的实现
}
}

在DbContext上已经存在您想要的名为Set的方法,例如var results=DbContext.Set()


如果使用的是ObjectContext,则所需的方法是CreateObjectSet()。

在名为Set的DbContext上已经存在所需的方法,例如var results=DbContext.Set()


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

有趣的是,因为我的dbContext是由EF自动生成的(数据库优先),所以我甚至没有一个名为.GetTable()的方法。。。这就是为什么我试图找到一种替代方法//return session.Query();那是NHibrate,不是吗?是的,只是随便举了几个例子…我更像是NHIb而不是EF。它在很多方面都更好。您的更新对于EF DB是正确的:context.CreateObjectSet()啊,酷,现在我只需要知道如何调用它。谢谢你的帮助。有趣的是,因为我的dbContext是由EF自动生成的(数据库优先),所以我甚至没有一个名为.GetTable()的方法。。。这就是为什么我试图找到一种替代方法//return session.Query();那是NHibrate,不是吗?是的,只是随便举了几个例子…我更像是NHIb而不是EF。它在很多方面都更好。您的更新对于EF DB是正确的:context.CreateObjectSet()啊,酷,现在我只需要知道如何调用它。谢谢你的帮助。