0

Je suis nouveau à Fluent NHibernate.C# Fluent NHibernate queryover comment interroger des enregistrements à partir de la table de liaison dans plusieurs à plusieurs relation

J'ai les mappages suivants pour de nombreuses relations. Comment écrire une requête en utilisant queryover afin de ramener des enregistrements si le produit n'existe pas dans la table des produits mais est disponible dans la table ProductLink? Pour une raison quelconque, les données ne sont pas correctes car il s'agit d'un système existant. Donc, ne veut pas ignorer les enregistrements qui ne sont pas la table des produits.

Quelqu'un peut-il m'aider s'il vous plaît comment y parvenir?

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>(); 

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(); 
} 

Produit

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"); 
    } 
} 

Répondre

0

Comme vous l'avez dit vous-même, un produit doit exister et de plus PROD_NO sur PROD_LINK devrait être un fk dans votre base de données, y notre problème n'existe pas ..

Dans votre cas, vous pouvez simplement interroger le linktable et rejoindre l'actif:

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