【问题标题】:QueryOver order by joined alias: The multi-part identifier could not be boundQueryOver order by join alias: 无法绑定多部分标识符
【发布时间】: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


【解决方案1】:

我找到了适合我的解决方法。我将查询一分为二(其中一个是分离的):

var thirdPartiesInDomain = QueryOver.Of<ThirdPartyCompany>()
                                    .WhereRestrictionOn(x => x.Domain.Id)
                                    .IsIn(domainIds)
                                    .Select(x => x.Company.Id);

var thirdParties = Session.QueryOver<Company>()
                          .WithSubquery.WhereProperty(x => x.Id)
                          .In(thirdPartiesInDomain)
                          .OrderBy(x => x.Name).Asc
                          .List();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-05
    • 1970-01-01
    • 2011-11-10
    • 2010-11-02
    • 2023-03-21
    相关资源
    最近更新 更多