【发布时间】:2014-03-24 17:10:53
【问题描述】:
我在查询时遇到问题:
Company thirdParty = null;
var thirdParties = Session.QueryOver<ThirdPartyCompany>()
.JoinAlias(x => x.Company, () => thirdParty)
.WhereRestrictionOn(x => x.Domain.Id)
.IsIn(domainIds)
.OrderBy(() => thirdParty.Name).Asc
.Select(x => x.Company)
.List<Company>();
ThirdpartyCompany 实体看起来像这样,本质上是一个映射的多对多表:
public class ThirdPartyCompany
{
public virtual Domain Domain { get; set; }
public virtual Company Company { get; set; }
// ... removed equality overrides for readability
}
我遇到的问题是订单部分。如果我跳过排序,则查询有效。但是通过订购我得到一个例外,上面写着{"The multi-part identifier \"thirdparty1_.Name\" could not be bound."}。我也尝试过.OrderByAlias( ),但也没有成功...
编辑(添加映射):
public class ThirdPartyCompanyMapping : ClassMapping<ThirdPartyCompany>
{
public ThirdPartyCompanyMapping()
{
Table("ThirdPartyCompany");
ComposedId(mapping => mapping.ManyToOne(x => x.Domain, m =>
{
m.Column("DomainId");
m.NotNullable(true);
}));
ComposedId(mapping => mapping.ManyToOne(x => x.Company, m =>
{
m.Column("CompanyId");
m.NotNullable(true);
}));
}
}
public class CompanyMapping : ClassMapping<Company>
{
public CompanyMapping()
{
Property(x => x.Name, m => m.NotNullable(true));
Property(x => x.Type, m => m.NotNullable(true));
ManyToOne(x => x.Domain, m => m.NotNullable(false));
}
}
public class DomainMapping : ClassMapping<Domain>
{
public DomainMapping()
{
Property(x => x.Name, m =>
{
m.NotNullable(true);
m.Unique(true);
});
Set(x => x.ThirdParties, m =>
{
m.Table("ThirdPartyCompany");
m.Key(x => x.Column("DomainId"));
}, c => c.ManyToMany());
//... removed other mappings for readability
}
}
【问题讨论】:
-
你能发布你的映射吗?
-
别生气,但这里有一个“是否已插入”的问题:
Name列是否存在于Company表中?也就是说,这个 SQL 查询SELECT TOP 1 Name FROM Company;运行时没有错误吗? -
你能发布 NHibernate 试图执行的 SQL 吗?
-
@DanielSchilling,是的,查询返回一行(有一个名称)。
-
@DanielSchilling,sql 看起来像这样:
SELECT this_.CompanyId as y0_ FROM ThirdPartyCompany this_ WHERE this_.DomainId in (@p0) ORDER BY thirdparty1_.Name asc
标签: nhibernate queryover