【问题标题】:nhibernate joinalias doesnt build right querynhibernate joinalias没有建立正确的查询
【发布时间】:2013-11-15 23:52:51
【问题描述】:

每当我尝试执行此查询 (QueryOver) 时,我都会收到 SqlException (The multi-part identifier "packageali1_.PackageID" could not be bound.)

var brandsFromBrandsInManufacturer2 =
  session.QueryOver<Brand>(() => brandAlias)
    .JoinAlias(brand => brand.Package, () => packageAlias)
    .Where(
       brand =>
       brand.ArtificialBrand == 0
     )
    .And(brand => packageAlias.PackageID
       .IsIn(branchPackagesProductGroupShortName.Keys))
    .Select(brand => brand.BrandName,
       brand => packageAlias.PackageID)
    List<object[]>();

我的映射似乎有错误:

public class PackageMap : ClassMap<Package>
{
    public PackageMap()
    {
        Table("Packages");
        Id(x => x.PackageID).GeneratedBy.Identity();
        Map(x => x.Aggregated).CustomType<PackageAggregation>();
        References(x => x.DataEndPeriod, "DataEndPeriodID");
        References(x => x.Country, "CountryID");
        References(x => x.ProductGroup, "ProductGroupID");

        HasMany(x => x.PackageHierarchies).KeyColumns.Add("PackageId");
        HasMany(x => x.Brands).KeyColumns.Add("PackageId").Inverse();
    } 
}


public BrandMap()
    {
        Table("Brands");
        CompositeId().KeyProperty(x =>x.BrandId).KeyReference(x => x.Package, "PackageId");
        Map(x => x.BrandName);
        References(x => x.Manufacturer).Columns(x => x.ManufacturerId).Nullable();
        Map(x => x.ArtificialBrand);
    }

但我找不到问题所在。我发现的唯一事实是,Brand 具有经典 ID 键,但 Package 具有复合键。

PS:来自 nHibernate 的 SQL 查询是:

 SELECT this_.BrandName as y0_, packageali1_.PackageID as y1_ FROM CD.Brands this_ WHERE this_.ArtificialBrand = @p0 and packageali1_.PackageID in (...)

如您所见,没有 JOIN。

谁能指点我哪里出了问题?

【问题讨论】:

    标签: c# sql nhibernate fluent-nhibernate


    【解决方案1】:

    这里的解决方案是直接使用 Key 属性 Package,而不是其别名。因此,让我们直接通过brand.Package.PackageID 导航而不是packageAlias.PackageID

    另外,如果我们创建了这么多别名,让我们使用它们

    var brandsFromBrandsInManufacturer2 = session
        .QueryOver<Brand>(() => brandAlias)
        .JoinAlias(() => brandAlias.Package, () => packageAlias) // use brandAlias
        .Where(() => brandAlias.ArtificialBrand == 0 )
        // no go to Package directly, not via packageAlias
        .And(() => brandAlias.Package.PackageID
           .IsIn(branchPackagesProductGroupShortName.Keys))
        // the same here, the brand.Package...
        .Select(brand => brand.BrandName,
           brand => brand.Package.PackageID)
        List<object[]>();
    

    嗯,第二行实际上是多余的。所以它可能是这样的:

    var list = session
        .QueryOver<Brand>(() => brandAlias)
        .Where(() => brandAlias.ArtificialBrand == 0 )
        .And(() => brandAlias.Package.PackageID
           .IsIn(branchPackagesProductGroupShortName.Keys))
        .Select(brand => brand.BrandName,
                brand => brand.Package.PackageID)
        List<object[]>();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 2018-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多