【问题标题】:Generic Query with Entity Framework 4. Generic Repository?使用实体框架的通用查询 4. 通用存储库?
【发布时间】:2011-03-01 20:03:48
【问题描述】:

这是我的数据库结构:
公司
公司ID
公司名称
...

位置
位置ID
位置名称
...

联系方式
联系人ID
联系人姓名
联系邮箱

公司联系方式
联系人ID
公司ID
已激活

位置联系方式
联系人ID
位置ID
已激活

现在我为每个实体(CompanyContact、LocationContact)都有一个存储库

public List<Contact> GetCompanyContact(int CompanyID)
{
   return _context.CompanyContacts.Where(p => p.CompanyID == CompanyID).Select(s => s.Contact).ToList();
}
...
public List<Contact> GetLocationContact(int LocationID)
{
   return _context.LocationContacts.Where(p => p.LocationID == LocationID).Select(s => s.Contact).ToList();
}
...

如何创建通用方法来获取联系人列表。 我想传递带有参考列名称(CompanyID、LocationID)的 EntityName(CompanyContact 或 LocationContact)。
我想要的示例:

public List<Contact> GetContact(string EntityName,String ColName){....}
Ex of call .
GetContact("CompanyContact","CompanyID");

非常感谢。

编辑
一个公司可以有很多联系人,一个位置也可以有很多联系人。

【问题讨论】:

    标签: asp.net-mvc-2 entity-framework-4 repository-pattern generic-programming


    【解决方案1】:

    大概,你的存储库中有你的数据库上下文,所以我会使用一些泛型和一些 lambda 来得到一些简洁的东西,就像这样:

    public class MyRepository {
        var _context = new MyEFDatabaseEntities();
    
        public List<T> GetListOf<T>(Expression<Func<T, bool>> expression)
            where T : class {
    
            return _context.CreateObjectSet<T>().Where(expression).ToList();
        }
    }
    

    这个小单行让你可以做这样有趣的事情:

    // first make a repository object
    var repository = new MyRepository();
    
    // now I can grab a list of contacts based on CompanyID
    var contacts = repository.GetListOf<Contact>(c => c.ContactID == 12345);
    
    // or I can get a list of contacts based on location
    var contacts = repository.GetListOf<Contact>(c => c.LocationID == 12345);
    
    // get all contacts for a company
    var contacts = repository.GetListOf<CompanyContact>(c => c.CompanyID == 123).Contacts;
    
    // get all confabs for a location
    var contacts = repository.GetListOf<LocationContact>(c => c.CompanyID == 123).Contacts;
    

    【讨论】:

    • 这不起作用...我在表达式 c =>c.LocationID == 12345 或 c=> c.CompanyID == 12345 中没有属性(CompanyID 或 LocationID) .
    • 确保您有 System.Linq 的 using 语句
    • 只要您的Contact 类具有适当的属性,这应该可以工作。确保通过传递您希望返回的实体对象的类型来调用 GetListOf。
    • 我可以让它工作的唯一方法是: var contacts = repository.GetListOf(p => p.CompanyContacts.Any(pc => pc.ContactID == p.ContactID && pc .CompanyID == CompanyID));
    • 我添加了更多示例来帮助您。他们应该工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多