Entity Framework 6 外键关联表多条件搜索实现问询
退货记录多条件查询实现方案
完全不需要全量拉取数据再分阶段过滤,直接通过数据库关联查询即可简洁实现,以下是具体方案:
前提表结构说明
因为单条退货记录可关联多个退货原因,标准设计下共3张表(如果你的现有结构已经把关联关系做进了其他表,对应调整字段即可):
- Returns表:存储退货基础信息,核心字段
return_id(主键)、description(退货描述)、其他业务字段 - Cause表:存储退货原因字典,核心字段
cause_id(主键)、cause_name(退货原因名称) - 中间关联表
return_cause_rel:存储退货和原因的绑定关系,核心字段return_id、cause_id
具体实现方式
1. 原生SQL实现
直接通过关联+条件过滤即可,示例代码如下:
SELECT DISTINCT r.* FROM Returns r INNER JOIN return_cause_rel rel ON r.return_id = rel.return_id INNER JOIN Cause c ON rel.cause_id = c.cause_id WHERE r.description LIKE '%Table%' AND c.cause_name = 'Wrong Colour';
如果description字段检索频率高,建议加全文索引,把LIKE '%Table%'替换为对应数据库的全文检索函数,性能会提升数倍。
2. ORM框架实现
如果使用EF Core、Django ORM等框架,可直接通过关联属性查询,不需要手动处理关联逻辑,以EF Core为例:
var matchReturns = _context.Returns .Where(r => r.Description.Contains("Table") && r.Causes.Any(c => c.CauseName == "Wrong Colour")) .ToList();
只有当过滤规则极其特殊、数据库层面无法高效计算的时候,才需要考虑把预过滤后的小批量数据拉到应用层做二次处理,你当前的需求完全可以在数据库层面完成,性能远高于全量拉取后过滤的方案。
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

