1

多くの関係がマッピングされたクラスがあります。これらの関係の1つは、具体的なユーザーのためにフェッチする必要があります。

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 ON stocks.companyId = company.id AND stocks.ownerId = 123456

実際ownerIdは、ユーザーがシステムにログオンした後の実行時にのみ認識されます。Stocks具体的なユーザーのために、会社に関するすべての情報とその会社のリストを取得したいと思います。

4

2 に答える 2

0

「コレクションのフィルタリング」と呼ばれる機能を使用できます。必要に応じて、あなたが言及したエンティティを使用してサンプル アプリケーションを作成できます。

于 2012-05-02T22:23:20.430 に答える
0

あなたの質問の前提は間違っていると思います.左外部結合にオブジェクトをマップしません. 外部キー参照を使用してデータベースにマッピングするか、次のようなクラス マップを使用して 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 フィールドを与えるマップが設定された Company オブジェクトがありました。これは、株式および会社との単純な親子 ID タイプの関係です。私は仮定しています。hibernate と nhibernate の背後にある考え方は、オブジェクトに ID 参照を含める必要がないということです。それはあなたのためにそれを処理します

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

クエリで何をしたいと言ったのか、あいまいなところがありますが、すべての株式を一覧表示し、その株式が特定の所有者によって所有されている場合は、その株式の会社も一覧表示したいようです。もう 1 つの可能性は、すべての会社を一覧表示し、特定の ID が所有する株式がある場合は、その株式も一覧表示することです。

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

from Cat as cat
    left join cat.kittens as kitten

linq を使用する C# では、次のを使用できます。

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) };
于 2012-05-01T23:18:02.257 に答える