【发布时间】:2018-11-27 08:58:30
【问题描述】:
我正在运行一个需要计算免赔额的 EF 语句。经过长时间的尝试,我似乎无法在 .Select() 语句中添加自定义函数。相反,我试图在 .Select() 语句之后添加值。
这里的问题是,在我的CalculateDeductibles() 中,我似乎无法向item.Deductibles 添加任何值。
GetDeductibles(item.RequestId) 是一个相当繁重的函数,它会执行几个额外的查询,所以我试图阻止将我的 IQueryable 转换为 IList 对象。
所以实际上有2个问题:
- 我可以在
.Select()语句中直接使用GetDeductibles()函数吗? - 在我完成
.Select()之后,我能否以某种方式(密切关注性能)增加价值?
代码:
public IQueryable<ReinsuranceSlip> GetReinsuranceSlipsOverview(int userId, int companyId, string owner, string ownerCompany)
{
IQueryable<ReinsuranceSlip> model = null;
model = _context.Request
.Where(w => w.RequestGroup.ProgramData.MCContactId == userId)
.Select(x => new ReinsuranceSlip()
{
Id = x.Id,
RequestId = x.Id,
LocalPolicyNumber = x.LocalPolicyNumber,
BusinessLine = x.RequestGroup.ProgramData.BusinessLine.DisplayName,
BusinessLineId = x.RequestGroup.ProgramData.BusinessLine.Id,
ParentBroker = x.RequestGroup.ProgramData.Broker.Name,
LocalBroker = x.Broker.Name,
InceptionDate = x.InceptionDate,
RenewDate = x.RenewDate,
//Deductibles = CalculateDeductibles(x)
});
CalculateDeductibles(model);
return model;
}
private void CalculateDeductibles(IQueryable<ReinsuranceSlip> model)
{
//model.ForEach(m => m.Deductibles = GetDeductibles(m.RequestId));
foreach (var item in model)
{
item.Deductibles = GetDeductibles(item.RequestId);
}
}
【问题讨论】:
-
您正在使用 LINQ to EF,而不仅仅是 IQueryable。提供者应该能够将查询转换为 SQL,这意味着它不能包含客户端代码。 Q Linq-toSQL 和 EF Core 通过将尽可能多的查询转换为 SQL,然后在客户端上执行其余的处理,这也不是一件 坏 的事情。缺点是他们会在没有警告的情况下在客户端上提取 LOT 数据。
-
什么是
Deductibles?GetDeductibles是做什么的?这是计算还是尝试检索相关实体? -
无论如何,ORM不适合报告查询。也许您应该创建一个生成所需结果的报告视图,然后将其映射到它自己的实体。或者创建一个适当的报告架构并映射到它
-
GetDeductibles通过linq to EF从数据库中获取更多相关数据。见:i.stack.imgur.com/IK5c0.png -
存储过程能帮我解决这个问题吗?
标签: c# entity-framework linq iqueryable