如何使用存储库模式在实体框架中执行复杂的查询(例如,通过多对多关系)?

发布于 2024-10-16 11:56:11 字数 721 浏览 0 评论 0原文

我正在使用实体框架 v4 和在这个问题的答案中找到的存储库模式:

为每个对象创建通用存储库与特定存储库相比有何优势?

也就是说,每个存储库都继承自一个抽象基类,该基类包含添加、删除等通用方法。并且还为该存储库/实体特有的任何方法实现特定的存储库接口。

IE。

public class CompanyRepository : Repository<Company>, ICompanyRepository {
     public Company Get(int id)
     {
       return base.ObjectSet.SingleOrDefault(x => x.Id == id);
     }
}

如何执行更复杂的查询来引用不属于此存储库的实体...(例如与另一个表的多对多关系)?

public List<Company> GetAllCompaniesForUser(int userId) 
{
    return base.ObjectSet.Where(x => x.Users ?????
}

I am using Entity Framework v4 and the repository pattern found in the answer to this SO question:

Advantage of creating a generic repository vs. specific repository for each object?

Namely, each repository inherits from an abstract base class that contains generic methods like add, delete, etc. and also implements a specific repository interface for any methods that are unique to that repository/entity.

ie.

public class CompanyRepository : Repository<Company>, ICompanyRepository {
     public Company Get(int id)
     {
       return base.ObjectSet.SingleOrDefault(x => x.Id == id);
     }
}

How can I perform more complex queries that reference entities that are not part of this repository... (say across a many-to-many relationship to another table)?

public List<Company> GetAllCompaniesForUser(int userId) 
{
    return base.ObjectSet.Where(x => x.Users ?????
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

云归处 2024-10-23 11:56:11

我认为这可能是这样做的方法:

return base.ObjectSet.Where(x => x.Users.Any(u => u.Id == userId)).ToList();

或者

var companies = from c in base.ObjectSet
                from u in c.Users
                where u.Id == userId
                select c;

return companies.ToList();

I think this may be the way to do it:

return base.ObjectSet.Where(x => x.Users.Any(u => u.Id == userId)).ToList();

or

var companies = from c in base.ObjectSet
                from u in c.Users
                where u.Id == userId
                select c;

return companies.ToList();
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文