2012-04-24 6 views
1

私は多くの関係がマップされたクラスを持っています。 これらのリレーションの1つを具体的なユーザー用に取得する必要があります。流暢なnhibernateの左結合ON後期バインド、ランタイム値

public class Company 
{ 
    public int id { get; set; } 
    public string Name { get; set; } 
    public IList<StocksPack> stocks { get; set; } 
    // a lot of other properties referencing other objects 
} 

public class StocksPack 
{ 
    public int stockId { get; set; } 
    public int companyId { get; set; } 
    public int amount { get; set; } 
    public int ownerId { get; set; } 
} 

どのように私はstocksは、ユーザーがシステムにログオンした後に、実際のownerIdは、実行時にのみ知られている左外部結合 ON stocks.companyId = company.id AND stocks.ownerId = 123456

されるマップでください。 具体的なユーザーのために会社に関するすべての情報とその会社のStocksのリストを取得したいと思います。

答えて

0

あなたの質問の前提は間違っていると思います。オブジェクトを左外部ジョインにマップしないでください。あなたは、次のようなclass mapで外部キー参照を持つデータベースまたはNHibernateの中でそれらをマップ:

public class StockeMap : ClassMap<Stock> 
{ 
    public EmployeeMap() 
    { 
     Id(x => x.Id); 
     References(x => x.company); 
    } 
} 
在庫はのように見えた

public class Stock{ 
    public virtual Company company {get; set;} 
} 

そして、あなたはマップで、いくつかの会社のオブジェクトを持っていましたidフィールドを与えてセットアップしてください。 これは、株式と会社との間にある単純な親子のIDタイプの関係です。私は推測している。 hibernateとnhibernateの背後にある考え方は、あなたのオブジェクトにID参照を持つ必要はないということです。それはあなたのために処理します

データをクエリすると、左外部結合が入力されます。言い換えれば、マッピングは2つのタイプの関係です。クエリは、その関係をどのように表現したいか、またどのデータを必要とするかに関するステートメントです。前者はデータモデルとシステム設計のプロパティで、後で実行時に発生するイベントです。

あなたはクエリーをしたいと言った内容に多少の曖昧さがありますが、すべての株をリストし、ある株主がその株を所有している場合は、その株も同様です。もう1つの可能性は、すべての企業をリストし、特定のIDで株式を所有している場合は、その株式も一覧にしたいということです。

どちらの場合でも、単純な左結合クエリが必要です。流暢bhibernateでは、これらはthisのようになります。

from Cat as cat 
    left join cat.kittens as kitten 

C#では、あなたがこのexampleを使用することができますLINQを使用して:

var query = from person in people 
        join pet in pets on person equals pet.Owner into gj 
        from subpet in gj.DefaultIfEmpty() 
        select new { person.FirstName, PetName = (subpet == null ? String.Empty : subpet.Name) }; 
0

あなたは "Filtering collections" と呼ばれる機能を使用することができます。あなたが望むなら、あなたが言及したエンティティを使ってサンプルアプリケーションを作ることができます。

関連する問題