我尝试多次连接别名,但这取决于它应该这样做的次数。
Employee employeeAlias = null;
Thing thingAlias = null;
var names = string[] {"A", "B", "C", "D", "E"} // number of values could vary
for(int i = 0; i < names.Length ; i++)
{
queryOver
.JoinAlias(() => employeeAlias.Things,
() => thingAlias,
JoinType.LeftOuterJoin,
Restrictions.Eq(Projections.Property(() => thingAlias.Name,
names[i]));
}
然而,在执行时,NHibernate会抛出错误说:
NHibernate.QueryException: duplicate alias: thingAlias ---> System.ArgumentException: An item with the same key has already been added
有没有办法让NHibernate加入一个具有指定名称的别名,以便它不会重用变量的名称?
谢谢你们。自昨天以来,这一直是我的问题,我无法找到合适的解决方案。
PS:
我试图做这样的事情:
SELECT * FROM Employee e
LEFT OUTER JOIN Thing t on e.Id = t.EmployeedId AND t.Name = "A"
LEFT OUTER JOIN Thing t on e.Id = t.EmployeedId AND t.Name = "B"
答案 0 :(得分:1)
你想要达到的目标是不可能的。每个关系(many-to-one
,one-to-many
)只能使用一次。
要支持此声明,请在此处查看:CriteriaQueryTranslator.cs
private void CreateAssociationPathCriteriaMap()
{
foreach (CriteriaImpl.Subcriteria crit in rootCriteria.IterateSubcriteria())
{
string wholeAssociationPath = GetWholeAssociationPath(crit);
try
{
associationPathCriteriaMap.Add(wholeAssociationPath, crit);
}
catch (ArgumentException ae)
{
throw new QueryException("duplicate association path: "
+ wholeAssociationPath, ae);
}
因此,我们可以在这里看到,无论别名如何,最后,所有关联关系(JOINS)都会添加到associationPathCriteriaMap
,即IDictionary<string, ICriteria>
。
这意味着,现在有了如何在游戏中使用两个相同的键...
答案 1 :(得分:0)
我没有尝试过,但我认为不是使用for-loop
和Restrictions.Eq
,我们可以(不确定,但如果您没有尝试过)使用{{ 1}}喜欢 -
Restrictions.In