gpt4 book ai didi

c# - 如何在 Repository 中实现通用方法以在 linq 中进行连接

转载 作者:行者123 更新时间:2023-11-30 21:35:08 24 4
gpt4 key购买 nike

你好,我有一个 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。

你如何让它变得通用?

在过去的几年里,我尝试了很多事情,最后,我发现特定的方法效果最好。因此,我将拥有一个用于简单内容的通用基础存储库,但当我需要执行此类操作时,我将对其进行扩展。

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

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

(Queryable 是基础存储库上的一个 protected 方法)

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

就是说,如果有人有更好的方法,我很乐意听听!

关于c# - 如何在 Repository 中实现通用方法以在 linq 中进行连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49507211/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com