提问人:Pretors 提问时间:7/5/2023 最后编辑:Pretors 更新时间:7/7/2023 访问量:32
如何在NHibernate的自定义函数生成器中修改treeBuilder.Dot以生成LEFT JOIN而不是INNER JOIN?
How to modify treeBuilder.Dot to generate LEFT JOIN instead of INNER JOIN in custom function generator for NHibernate?
问:
我正在尝试将 LINQ 扩展到我的自定义函数的 NHibernate 提供程序。我发现的问题是,每当我尝试从我的实体访问 FK 时,它都会生成一个“INNER JOIN”语句,但我希望有一个 LEFT JOIN,所以我拥有所有“DistributorAnswers”,其中“Distributor”FK 为 null。
下面是 BuildHql:
public override HqlTreeNode BuildHql(MethodInfo method, Expression targetObject,
ReadOnlyCollection<Expression> arguments,
HqlTreeBuilder treeBuilder, IHqlExpressionVisitor visitor)
{
var targetNode = visitor.Visit(targetObject).AsExpression();
return treeBuilder.Dot(targetNode, treeBuilder.Ident(nameof(DistributorAnswer.Distributor)));
}
生成的 SQL 查询当前使用 INNER JOIN,我需要修改它以改用 LEFT JOIN。
下面是我使用 SQL Server Profiler 找到的查询输出
EXEC sp_executesql N'select TOP (@p0)
...
from [DistributorAnswer] distributo0_
inner join [Distributor] distributo1_ on distributo0_.Distributor_id=distributo1_.Id
下面是我尝试使用自定义函数运行的 LINQ:
Session.Query<DistributorAnswer>()
.Select(x => x.MyCustomMethod())
.Take(10)
.ToList();
我面临的问题是我不知道如何修改treeBuilder.Dot方法以生成所需的LEFT JOIN。我已经检查了 HqlTreeBuilder 类中的可用方法和属性,但我找不到指定联接类型的直接方法。
我尝试使用treeBuilder.LeftJoin,但我找不到任何关于此的文档,我真的不明白它是如何工作的。
提前感谢您的帮助!
答: 暂无答案
评论
DistributorAnswer
Distributor
[CanBeNull]
DistributorAnswer
[CanBeNull] public virtual Distributor Distributor { get; set; }