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
订单
可以是分离的
实体(例如,通过客户端的方法参数接收),也可以是从数据库获取的现有实体如果希望使用集合而不是单个实体,则该方法可能如下所示-
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
,因为我们不寻找特定的实体//订单有客户父项和订单行子项列表
var orderList=wait _Repo.LoadAllWithRelatedAsync(p=>p.Customer,p=>OrderLines);
如果存储库模式有问题,不要使用它……首先非常感谢您的时间和努力,但我不知道在您提供的最后一个使用示例中如何发送订单,我不知道是应该将order
参数作为type还是order
类对象还是什么?再次非常感谢兄弟我真的很感谢你you@DEV请检查编辑
。我真的很感谢你的兄弟,非常感谢你的时间和努力,我还有一个问题我在你的答案下面提供了答案你在想什么,换言之,我在下面的答案中提供的解决方案存在性能问题或其他问题??再次表示衷心的感谢bro@DEV我已经更新了帖子和代码,请检查。答案的代码中有一个问题-ToList()
每次调用都会返回一个新列表,因此在result
中,您将只获得最后包含的相关实体。你测试过代码吗?没有,我还没有测试