C# EF Core:如何从通用存储库中的表和相关表加载数据

C# EF Core:如何从通用存储库中的表和相关表加载数据,c#,entity-framework-core,repository-pattern,C#,Entity Framework Core,Repository Pattern,我创建了一个通用存储库,可以帮助我完成项目 问题: 在这些日子里,我在一个项目中工作,我想从一些相关的表中获取数据(所有数据都来自一个表,也从我选择的其他表中加载所有相关数据),我创建的存储库无法处理这个问题,我也不想直接使用Entity Framework Core 我的存储库: 我的存储库是一个开源项目,你可以看到源代码 我到底想要什么: 我的想法是在我的通用存储库中创建一个方法,该方法将接收我要从中选择数据的实体,并接收一个表达式,告诉它从气味实体和一些相关表(不是所有相关表,而是我将在表

我创建了一个
通用存储库
,可以帮助我完成项目

问题:

在这些日子里,我在一个项目中工作,我想从一些相关的表中获取数据(所有数据都来自一个表,也从我选择的其他表中加载所有相关数据),我创建的存储库无法处理这个问题,我也不想直接使用Entity Framework Core

我的存储库:

我的存储库是一个开源项目,你可以看到源代码

我到底想要什么:

我的想法是在我的
通用存储库中创建一个方法
,该方法将接收我要从中选择数据的实体,并接收一个表达式,告诉它从气味实体和一些相关表(不是所有相关表,而是我将在表达式中发送的一些相关表)加载数据


如何解决这个问题?

这在很大程度上取决于您对泛型存储库的具体实现,但下面的代码可能会帮助您了解这一点-

public async Task LoadSingleWithRelatedAsync(tenty实体,参数表达式[]expressionList),其中tenty:EntityBase
{
if(实体==null)
返回null;
var query=_DbCtx.Set().AsQueryable();
foreach(expressionList中的变量表达式)
{
query=query.Include(表达式);
}
返回wait query.FirstOrDefaultAsync(p=>p.Id==entity.Id);
}
其中
EntityBase
为-

公共类EntityBase
{
公共int Id{get;set;}
}
下面是一个如何使用它的示例-

//订单有客户父项和订单行子项列表
var loadeOrder=wait _Repo.loadeSingleWithRelatedAsync(订单,p=>p.Customer,p=>OrderLines);
  • Order
    必须是从
    EntityBase
  • 订单
    可以是
    分离的
    实体(例如,通过客户端的方法参数接收),也可以是从数据库获取的现有实体
  • 编辑:2021.04.01
    如果希望使用集合而不是单个实体,则该方法可能如下所示-

    public async Task LoadAllWithRelatedAsync(params Expression[]expressionList),其中tenty:class
    {
    var query=_DbCtx.Set().AsQueryable();
    foreach(expressionList中的变量表达式)
    {
    query=query.Include(表达式);
    }
    return wait query.ToListAsync();
    }
    
    这里-

  • tenty
    不需要具有作为
    EntityBase
    类型的约束,因为我们不使用
    Id
    属性
  • 不需要参数
    entity
    ,因为我们不寻找特定的实体
  • 要标识调用代码中的类型,在调用方法时必须使用type参数-
  • //订单有客户父项和订单行子项列表
    var orderList=wait _Repo.LoadAllWithRelatedAsync(p=>p.Customer,p=>OrderLines);
    
    如果存储库模式有问题,不要使用它……首先非常感谢您的时间和努力,但我不知道在您提供的最后一个使用示例中如何发送订单,我不知道是应该将
    order
    参数作为type还是
    order
    类对象还是什么?再次非常感谢兄弟我真的很感谢你you@DEV请检查
    编辑
    。我真的很感谢你的兄弟,非常感谢你的时间和努力,我还有一个问题我在你的答案下面提供了答案你在想什么,换言之,我在下面的答案中提供的解决方案存在性能问题或其他问题??再次表示衷心的感谢bro@DEV我已经更新了帖子和代码,请检查。答案的代码中有一个问题-
    ToList()
    每次调用都会返回一个新列表,因此在
    result
    中,您将只获得最后包含的相关实体。你测试过代码吗?没有,我还没有测试