gpt4 book ai didi

NHibernate 在 QueryOver 中检查相同的连接

转载 作者:行者123 更新时间:2023-12-03 17:49:34 24 4
gpt4 key购买 nike

使用 QueryOver 我正在创建这样的查询

BulkActionItem bulkActionItemAlias1 = null;
BulkActionItem bulkActionItemAlias2 = null;

var query = GetSession().QueryOver<Student>(() => studentAlias)
.JoinAlias(() => studentAlias.BulkNotifications, () => bulkActionItemAlias1, NHibernate.SqlCommand.JoinType.LeftOuterJoin);

if (query.UnderlyingCriteria.GetCriteriaByAlias("bulkActionItemAlias2") == null
query = query.JoinAlias(() => studentAlias.BulkNotifications, () => bulkActionItemAlias2, NHibernate.SqlCommand.JoinType.LeftOuterJoin);

这会崩溃,因为我有两次使用不同别名的相同连接。是否可以检查查询中是否已经存在连接,即使使用不同的别名?

最佳答案

我还没有找到实现这一点的内置方法。通常我使用 out带有扩展方法的参数以跟踪哪些表是查询的一部分。例如:

bool joinedOnBulkNotifications;

BulkNotification notificationAlias = null;

Expression<Func<object>> aliasExpr = () => notificationAlias;

var query = GetSession().QueryOver<Student>(() => studentAlias)
.FilterByBulkNotificationStatus(
someCondition, aliasExpr, out joinedOnBulkNotifications);


public static class QueryExtensions
{
public static IQueryOver<Student, Student> FilterByBulkNotificationStatus(
this IQueryOver<Student, Student> query,
bool someCondition,
Expression<Func<object>> aliasExpr,
out bool joinedOnBulkNotifications)
{
joinedOnBulkNotifications = false;

if (someCondition)
{
joinedOnBulkNotifications = true;
query.JoinAlias(s => s.BulkNotifications, aliasExpr);
}

return query;
}
}

问题是您可能需要重用您稍后创建的别名。您可能想传入 BulkNotification并使用它,但这仅在参数名称与您传递给扩展方法的变量名称匹配时才有效。 NHibernate 使用变量名来创建别名,所以如果这两个不匹配,你会得到一个错误。因此,您需要将别名包裹在 Expression 中。并使用它。

这不是一个非常干净的选择,所以我希望有人有更好的解决方案。

关于NHibernate 在 QueryOver 中检查相同的连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24357268/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com