MDriven平台PSQuery性能优化及相关使用问题咨询
问题1:能否从PSQuery中直接获取其生成的SQL语句自行执行?
- 可以,PSQuery实例提供
GetGeneratedSQL()方法可直接输出生成的SQL语句,示例代码如下:var query = es.PSQuery<A>().Where(/*你的查询条件*/).SelectMany(x => x.Bs); string sql = query.GetGeneratedSQL(); - 查询对应的参数会同步存储在PSQuery的
Parameters属性中,无需自行解析SQL提取参数,可直接传入你使用的数据库执行组件使用。
问题2:能否设置让首次查询的SQL包含discriminator字段?
- 可以,针对你自定义OR-Mapping的场景,调整两处配置即可:
- 进入B类对应的表映射配置页,将
DISCRIMINATOR字段的加载策略设置为即时加载,排除在延迟加载字段列表外。 - 构造查询时追加
WithDiscriminator()扩展方法,强制SQL生成时带入鉴别器字段,示例:
var data = es.PSQuery<A>().Where(/*条件*/).SelectMany(x => x.Bs).WithDiscriminator().ToList(); - 进入B类对应的表映射配置页,将
- 调整后首次执行的SQL就会自带
DISCRIMINATOR字段,不会再触发后续的批量鉴别器查询。
问题3:保持现有模型不变的前提下,还有什么其他优化方案?
- 方案1:如果业务逻辑只需要特定子类的数据,直接在查询中追加
OfType<B1>()或OfType<B2>()指定子类类型,MDriven会直接生成对应子类的查询逻辑,无需鉴别器判断。 - 方案2:调整批量查询阈值,在MDriven全局配置中将
InheritanceBatchFetchSize参数值调整为不小于你单次查询返回B类对象的数量,即使需要查询鉴别器也只会发起1次请求,不会分多批次查询。 - 方案3:使用投影查询,如果业务场景不需要完整的B类实体,直接通过
Select()将需要的字段映射到自定义DTO,MDriven会直接生成单条包含所需字段的SQL,不会触发继承类的额外查询。 - 方案4:全局开启鉴别器预加载,在ORM全局配置中打开继承类查询默认加载鉴别器开关,所有针对抽象父类的查询都会自动包含鉴别器字段,无需每个查询单独追加配置。
内容的提问来源于stack exchange,提问作者Peter Buchmann
相关产品推荐
相关产品推荐

