gpt4 book ai didi

c# - 没有 EF Core 的 Linq 异步接口(interface)

转载 作者:行者123 更新时间:2023-12-04 12:38:30 28 4
gpt4 key购买 nike

假设我在 EF Core 中有一个如下所示的查询:

MethodWithDomainLogic() {
return this.dbContext.People.Where(...).ToListAsync();
}

现在,为了将我的领域层与我的数据访问层分离,我希望此方法位于我的领域程序集中,并且该程序集不具有对 EFCore 的引用。所以它看起来像:

在领域层:

public interface IEntities {
IQueryable<Person> People { get; set; }
}

在数据层:

private IEntities entities; // injected with a dbcontext that implements the IEntities interface.

public Task<IEnumerable<Person>> MethodWithDomainLogic() {
return this.entities.People.Where(...).ToListAsync(); // How to do this without referencing EFCore?
}

据我所知,这是不可能的,因为 Linq 本身不支持异步查询。

我已经解决了这个问题,方法是在域层中使用 EFCore 接口(interface)设置我自己的接口(interface)(基本上复制并粘贴 ToListAsync 和 FirstAsync 等方法......),然后在我的数据层中实现它对此的 EFCore 版本的调用。然而,那是非常困惑和复杂的。

有更好的解决方案吗?我希望我的域方法在没有 EFCore 的情况下使用异步编程和 Linq,但要在数据层中使用 EFCore 实现 Linq/异步编程。

最佳答案

需要从域层使用的许多查询方法是defined in EF ,不在框架的其他地方。 ToListAsync() , Include(navprop) , AsNoTracking()

如果您在域层中编写查询(您肯定应该这样做),并且您想要访问所有有用的 EF 功能,则需要对 EF 的引用。

可以不引用 EF,只使用 IQueryable<T> 的子集基础框架中定义的扩展方法,但这是有代价的。并且可以在您的域和 EF 之间放置某种自定义中间 API,但问题还是在于它是否值得付出努力。

关于c# - 没有 EF Core 的 Linq 异步接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61872479/

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