您好我有一个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。我只是想返回这一行的对象。
请指教。
答案 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中的所有数据访问逻辑,它使得单元测试服务变得简单,而且很清楚到底发生了什么上。
那就是说,如果有人有更好的方式,我很乐意听到它!