繁体   English   中英

如何在存储库中实现通用方法以在linq中进行联接

[英]How to implement a generic method in Repository to make joins in linq

您好,我有一个linq查询,该查询在表上进行多个联接,最终返回单行。

目前,我已经使用了返回单行的通用方法GetAll()

我写的查询如下:

from h in _repositoryWorkers.GetAll()
join p in _repositoryJobs.GetAll() on h.Id equals p.THI_N_ID
join q in _repositoryHome.GetAll() on h.Id equals q.THI_N_ID

    public Repository()
    {
        this.context = new WorkersContext();
        entities = context.Set<T>();
    }
    public IEnumerable<T> GetAll()
    {

            return entities.AsEnumerable<T>();

    }

我想要实现的是以下示例:

from w in repo.Query<Worker>()
join e in repo.Query<XEntity>() on ...

我不想使用仅返回单行的列表。 我只想返回此行的对象。

请指教。

孤立地,我会写类似的东西:

var result = context.Worker()
    .Include(worker => worker.XEntity)
    .Where(worker => worker.ID == id)
    .SingleOrDefault();

结果将是填充了XEntity的单个Worker实体,或者如果没有匹配ID的条目,则为null。

您如何使其通用?

在过去的几年中,我尝试了很多事情,最后,我发现特定的方法效果最好。 因此,我将为这些简单的东西提供一个通用的基础存储库,但是当我需要执行此类操作时,将对其进行扩展。

所以,我会对它扩展了通用基工人实体特定的资源库。 它将具有如下方法:

public Worker GetByIdWithXEntity(id)
{
    this.Queryable()
        .Include(worker => worker.XEntity)
        .Where(worker => worker.ID == id)
        .SingleOrDefault();
}

(可查询是在基座储存库中的受保护的方法)

这种方法有点像大型项目的皮塔饼,但是我发现它很好用,因为它将所有数据访问逻辑保留在Repo中,它使您的服务的单元测试变得简单,并且非常清楚正在发生的事情。

也就是说,如果任何人有一个更好的办法,我很想听听吧!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM