【发布时间】:2023-03-05 17:11:02
【问题描述】:
我正在尝试编写一个查询来过滤父表中的字段,包括子表并过滤子表中的字段。
我通过将 ToList 放在子选择器中来完成这项工作,但这对我来说感觉不对。这是正确的做法吗?
例子:
var query = _context.Set<order_header>()
.Where(oh => oh.customer == accountNo)
.Include(oh => oh.route_details)
.Select(oh => new order_header()
{
customer = oh.customer,
order_no = oh.order_no,
//other columns omitted
route_details = oh.route_details
.Select(rd => new route_detail() { route_code = rd.route_code})
.ToList()//this is odd
});
return query.ToList();
编辑: 我启用了 SQL 跟踪,我可以看到这是在做一个单独的查询来获取每个父行的子行。所以这绝对是错误的做事方式。
我开始认为我必须将结果选择为匿名类型,然后生成 EF 模型。
编辑2: 我现在已经删除了子查询选择中的 ToList,但 SQL 跟踪显示它仍在为每个父行运行查询。
代码:
var query = _context.Set<order_header>()
.Where(oh => oh.customer == accountNo)
.Include(oh => oh.route_details)
.Select(oh => new
{
customer = oh.customer,
order_no = oh.order_no,
//other columns omitted
route_details = oh.route_details.Select(rd => rd.route_code)
});
var result = query.ToList();
var list = new List<order_header>();
list.AddRange(result.Select(a =>
new order_header()
{
customer = a.customer,
order_no = a.order_no,
//other columns omitted
route_details = a.route_details.Select(rc => new route_detail() { route_code = rc }).ToList()
}));
return list;
编辑3 根据要求,SQL 跟踪:
父查询
exec sp_executesql N'SELECT [oph].[customer], [oph].[order_no], [oph].[customer_order_no], [oph].[date_received], [oph].[date_required], [oph].[date_despatched], [oph].[status], [oph].[to_reference], [oph].[from_reference], [oph].[nett_value]
FROM [scheme].[order_header] AS [oph]
WHERE [oph].[customer] = @__accountNo_0',N'@__accountNo_0 varchar(8)',@__accountNo_0='ACC_NO'
子查询
exec sp_executesql N'SELECT [avl].[route_code]
FROM [scheme].[route_detail] AS [avl]
WHERE @_outer_order_no = [avl].[ldordno]',N'@_outer_order_no varchar(10)',@_outer_order_no='1A469499 '
图片链接 http://i.imgur.com/Q4ATQiU.png
请注意,图像中的架构名称不同,因为我一直在为问题编辑它们。
【问题讨论】:
标签: c# linq linq-to-sql entity-framework-core