2012-04-24 69 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” 功能。如果你想要,我可以使用你提到的实体来制作一个示例应用程序。