gpt4 book ai didi

c# - Entity Framework 、存储库模式和 let 语句

转载 作者:行者123 更新时间:2023-11-30 17:30:49 25 4
gpt4 key购买 nike

尝试使用 Entity Framework 实现正确的 Repository 模式时,我遇到了 let 语句的一些问题。我想做的是:

var customer = (from cus in Customers.GetAll()
let brokerExists = InsuredBrokers.GetAll().Any(ib => ib.INS_Id == cus.INS_Id)
// ... more stuff

但这会给我一个错误

System.NotSupportedException: 'LINQ to Entities does not recognize the method 'System.Linq.IQueryable`1[SNIP.DataModel.EA_INB_InsuredBrokers_TB] GetAll()' method, and this method cannot be translated into a store expression.'

我可以做的是:

var customer = (from cus in Customers.GetAll()
let brokerExists = _context.Set<EA_INB_InsuredBrokers_TB>().Any(ib => ib.INS_Id == cus.INS_Id)
// ... more stuff

但是,这破坏了使用 Repository 模式的任何一点。当我搜索答案时,人们会说将其单独放入查询中并从内存中引用它,但由于我实际上在 let 语句中有客户的 ID (INS_Id),所以我不能这样做.

GetAll() 就像:

public IQueryable<T> GetAll()
{
return _context.Set<T>().AsQueryable();
}

有什么聪明的方法可以解决这个问题吗?

最佳答案

您必须将 InsuredBrokers.GetAll() 移出查询:

var allBrokers = InsuredBrokers.GetAll();
var customer = (from cus in Customers.GetAll()
let brokerExists = allBrokers.Any(ib => ib.INS_Id == cus.INS_Id)
// ... more stuff

然后它会正常工作。由于 GetAll 返回 IQueryable 并且您没有枚举它 - 这没有负面影响并且仍然会有一个对数据库的查询,就像您使用 的示例一样_上下文

原因是let语句是这样编译的:

Customers.GetAll().Select(cus => new {cus, brokerExists = InsuredBrokers.GetAll().Any(ib => ib.INS_Id == cus.INS_Id)}

这意味着您对 InsuredBrokers.GetAll() 的调用是表达式树的一部分(它在 Select 表达式中), Entity Framework 不能(不会)直接调用它获得值(value)。它会尝试将其转换为 SQL 查询,但不知道如何使用 GetAll 方法。

关于c# - Entity Framework 、存储库模式和 let 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49064864/

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