如何在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?

提问人:Pretors 提问时间:7/5/2023 最后编辑:Pretors 更新时间:7/7/2023 访问量:32

问:

我正在尝试将 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,但我找不到任何关于此的文档,我真的不明白它是如何工作的。

提前感谢您的帮助!

sql-server net-4.5 linq-to-nhibernate

评论

0赞 AlwaysLearning 7/6/2023
那么定义是什么呢?听起来 FK 在 C# 中被指定为不可为空。DistributorAnswerDistributor
0赞 Pretors 7/7/2023
DistributorAnswer 具有具有该特性的属性,在数据库中,有寄存器,其Distributor_Id为 null。这是我在里面定义它的方式[CanBeNull]DistributorAnswer [CanBeNull] public virtual Distributor Distributor { get; set; }

答: 暂无答案