如何在Repository中实现泛型方法以在linq中进行连接

时间:2018-03-27 07:51:05

标签: c# linq repository-pattern

您好我有一个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 ...

我不想使用只返回一行的List。我只是想返回这一行的对象。

请指教。

1 个答案:

答案 0 :(得分:3)

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

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

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

你如何使它成为通用的?

在过去的几年里,我尝试过很多东西,最后,我发现特定的方法效果最好。 因此,我将为简单的东西提供一个通用的基础存储库,但是当我需要做这样的事情时,我会扩展它。

因此,我将为扩展通用基础的Worker实体提供特定的存储库。 它会有一个方法:

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

(Queryable是基础存储库上的受保护方法)

这种方法对于大型项目来说有点过分,但我发现它的工作非常好,因为它保留了Repo中的所有数据访问逻辑,它使得单元测试服务变得简单,而且很清楚到底发生了什么上。

那就是说,如果有人有更好的方式,我很乐意听到它!