2012-04-24 68 views
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左外連接 ON stocks.companyId = company.id AND stocks.ownerId = 123456

凡實際ownerId只在運行時已知的,在用戶登錄到系統後。 我想獲得關於該公司的所有信息以及該公司的具體用戶的Stocks的列表。

回答

0

我認爲你的問題的前提是錯誤的:你不映射左外連接上的對象。你在與一個外鍵引用數據庫或NHibernate的映射他們一個class map類似如下:

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引用。它爲你處理

只有當你查詢數據時,左外連接纔會進入。換句話說,映射就是兩種類型之間的關係,查詢是關於如何表示這種關係的表述以及您想要的數據。前者是數據模型和系統設計的屬性,後者是在運行時發生的一些事件。

你說你想查詢的內容存在一些含糊不清的情況,但似乎你想要列出所有的股票,以及股票何時由某個所有者擁有,以及該股票的公司。另一種可能性是,你想列出所有的公司,並且當他們擁有一個特定的ID時,股票也是這樣。

無論哪種情況,您都需要一個簡單的左連接查詢。在流暢bhibernate這些看起來像this

from Cat as cat 
    left join cat.kittens as kitten 

在C#中使用LINQ您可以使用此example

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」 功能。如果你想要,我可以使用你提到的實體來製作一個示例應用程序。