C#Fluent NHibernate queryover如何从多个关系中查询Link表中的记录

时间:2016-08-05 15:35:08

标签: c#-4.0 fluent-nhibernate fluent-nhibernate-mapping queryover

我是Fluent NHibernate的新手。

我有许多关系的以下映射。

如何使用queryover编写查询,以便在产品表中不存在产品但在ProductLink表中可用时带回记录?由于某种原因,数据不合适,因为它是遗留系统。所以不想忽略不是产品表的记录。

有谁能帮助我如何实现这个目标?

Product productAlias = null;
Asset assetAlias = null;

var query = Session.QueryOver(() => assetAlias);

//Condn1: must be linked to a Product number
query.Inner.JoinAlias(() => assetAlias.Products, () => productAlias);           

var result = query
                .Skip(pageIndex * pageSize)
                .Take(pageSize)
                .Future<Asset>();   

资产

public AssetMap()
{
    Table("ASSET_INFO");

    Id(x => x.Id).GeneratedBy.Assigned().Column("MAT_ID");

    Map(x => x.Title);

    HasManyToMany(x => x.Products)
        .Table("PROD_LINK")
        .AsBag()
        .ParentKeyColumn("MAT_ID")
        .ChildKeyColumn("PROD_NO")
        .Cascade.All()
        .LazyLoad();
}

产品

public ProductMap()
{
    Table("PROD_INFO");

    Id(x => x.Id).GeneratedBy.Assigned().Column("PROD_NO");

    Map(x => x.Name).Column("PROD_NM");

    HasManyToMany(x => x.Assets)
        .Table("PROD_LINK")
        .ParentKeyColumn("PROD_NO")
        .ChildKeyColumn("MAT_ID")
        .Inverse()
        .LazyLoad();
}

PRODUCTLINK

public class ProductLinkMatMap : ClassMap<ProductLinkMat>
{
    public ProductLinkMatMap()
    {
        Table("PROD_LINK");

        CompositeId().KeyReference(x => x.Asset, "MAT_ID")
                     .KeyReference(x => x.Product, "PROD_NO");
    }
}   

1 个答案:

答案 0 :(得分:0)

正如您自己指出的那样,产品应该存在,而且PROD_LINK上的PROD_NO应该是您数据库中的fk,您的问题将不存在..

在您的情况下,您只需查询链接表并加入资产:

return Session.QueryOver<ProductLinkMat>(() => productLinkAlias)
                .JoinQueryOver(pl => pl.Asset, () => assetAlias, JoinType.InnerJoin)
                .Skip(pageIndex*pageSize)
                .Take(pageSize)
                .Future<Asset>();