2011-11-04 3 views
1

J'ai le mappage fluent Nhiberhate suivant, mais je ne peux pas comprendre comment obtenir une clause where dans l'une des jointures. Je veux seulement rejoindre la table des opérations où OperationKind == "TASK". Une idée sur la façon de parvenir à cela? Sans linq en dehors de la cartographie.where clause dans le mappage de jointure fluent nhibernate

La sql je veux ressemblerait à quelque chose comme

SELECT X.PHASE_S , PA.INTERVAL, PA.BOR, OP.DESCRIPTION 
FROM GG.PROJ_PHASE_X X 
inner join GG.PHASE PA 
on X.PHASE_S=PA.PHASE_S 
inner join GG.OPERATIONS OP 
ON X.PHASE_S = OP.PHASE_S 
WHERE OP.OPERATION_KIND = 'TASK'; 

Cartographie:

public class MySectionMap : ClassMap<MySectionEntity> 
{ 
    public MySectionMap() 
    { 
     Schema("GG"); 
     Table("PROJ_PHASE_X"); 
     Id(x => x.PhaseS, "PHASE_S").GeneratedBy.TriggerIdentity(); 
     References(x => x.Project).Column("PROJECT_S").Cascade.None().Not.LazyLoad().Not.Nullable(); 
     Join("PHASE", m => 
          { 
           m.Schema("GG"); 
           m.Fetch.Join(); 
           m.KeyColumn("PHASE_S"); 
           m.Map(t => t.Interval).Column("INTERVAL"); 
           m.Map(t => t.BorS).Column("BOR_S"); 
          }); 
     Join("OPERATIONS", m => // ONLY JOIN WHERE OPERATION_KIND EQUALS TASK? 
           { 
            m.Schema("GG"); 
            m.Fetch.Join(); 
            m.KeyColumn("PHASE_S"); 
            m.Map(t => t.Description).Column("DESCRIPTION"); 
            m.Map(t => t.OperationType).Column("OPERATION_KIND"); 
           }); 

    } 
} 

Répondre

1

Join est pour fusion simple des lignes de plusieurs tables en une seule entité. Ce que vous essayez d'accomplir est un peu plus complexe - vous essayez de filtrer certaines valeurs et en SQL vous le faites en utilisant la clause where, sans utiliser join, aussi.

Vous avez deux options - soit créer une vue dans la base de données et mapper votre entité à la vue (c'est fait exactement de la même manière que pour les tables). Ou deuxième option, plus de code côté est de ajouter restriction correspondant à votre where clause sur le niveau de la cartographie:

public MySectionMap() 
{ 
    Schema("GG"); 
    Table("PROJ_PHASE_X"); 

    Join("PHASE", m => //... 
    Join("OPERATIONS", //... 

    Where("OPERATION_KIND = 'TASK'"); 
} 
+0

je suis en train de faire à la fois rejoindre et j'essayer de filtrer. Puisque Operation_kind est dans la table des opérations, votre code ne fonctionnera pas. J'ai pensé à une vue, mais cela entraîne des problèmes lors de la sauvegarde des données dans la base de données. – randoms

+0

'Où' peut contenir du SQL arbitraire, donc cela devrait fonctionner. Avez-vous supprimé vos jointures? Vous devriez le laisser là. – NOtherDev

+0

La clause where est ignorée pour une raison quelconque, elle ne crée pas d'où dans la sortie sql. – randoms

1

la question est vieux, mais de toute façon. J'ai eu le même problème (anciennement db, pas autorisé à changer le schéma). Si c'est dans la clause where, nhibernate utilise l'alias de la première table qui provoque une erreur.

Ma solution était de définir une vue pour la jointure, puis d'utiliser la vue en tant que table jointe. La colonne qui ne pouvait pas aller dans la clause where est également mappée (de sorte que les insertions fonctionnent également). Dans votre cas, la vue pourrait être:

CREATE VIEW FilteredOperations 
    SELECT OP.PHASE_S, OP.DESCRIPTION, OP.OPERATION_KIND 
    FROM GG.OPERATIONS OP 
    WHERE OP.OPERATION_KIND = 'TASK'; 

Mes applications: Courant

public class Agency : EntityBase 
    { 
     public const string AgencyRoleId = "F1776564-1CA0-11d5-A70C-00A0120802D7"; 

     public Agency() 
     { 
      CountryId = "de"; 
      LanguageId = "de"; 
     } 

     public virtual string AgencyId { get; set; } 
     public virtual string Name { get; set; } 
     public virtual string UserDefinedName { get; set; } 
     public virtual string LanguageId { get; set; } 
     public virtual string CountryId { get; set; } 
     public virtual string RoleId 
     { 
      get 
      { 
       return AgencyRoleId; 
      } 
      set {} 
     } 
    } 

public AgencyMap() 
     { 
      Table("mgmt_location_102"); 
      Id(x => x.AgencyId, "LocationId").GeneratedBy.UuidHex("D"); 
      Map(x => x.CountryId, "CountryId"); 
      Map(x => x.LanguageId, "LanguageId"); 
      Map(x => x.Name,"CommonName"); 

      Join("mgmt_agency_ext", x=> 
             { 
              x.Optional(); 
              x.KeyColumn("AgencyLocationId"); 
              x.Map(y => y.UserDefinedName, "AgencyUserDefinedName"); 

             }); 

      Join("scs2.vAgencyRoles", x => 
      { 
       x.KeyColumn("LocationId"); 
       x.Map(y => y.RoleId, "RoleId").Not.Update(); 
      }); 
     } 
Questions connexes