流畅的nhibernate左连接ON后期绑定,运行时值

时间:2012-04-24 08:12:22

标签: c# fluent-nhibernate left-join

我有一个有很多关系映射的类。 应该为具体用户提取其中一个关系。

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映射为 left-outer-joined ON stocks.companyId = company.id AND stocks.ownerId = 123456

在用户登录系统后,仅在运行时知道实际ownerId的情况。 我希望获得有关该公司的所有信息以及该公司的Stocks列表,以供具体用户使用。

2 个答案:

答案 0 :(得分: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引用。它为你处理

左外连接仅在您查询数据时输入。换句话说,映射是两种类型之间的关系,查询是关于您希望如何表示关系以及您想要什么数据的声明。前者是数据模型和系统设计的属性,后者是运行时发生的事件。

你说你想要查询的内容有些含糊不清,但看起来你想要列出所有股票,当该股票由某个所有者拥有时,也要列出该股票的公司。另一种可能性是你要列出所有公司,当他们拥有特定身份证所拥有的股票时,也要列出该股票。

在任何一种情况下,您都需要一个简单的左连接查询。在流利的bhibernate中,这些看起来像this

from Cat as cat
    left join cat.kittens as kitten

在使用linq的C#中,您可以使用此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) };

答案 1 :(得分:0)

您可以使用名为“Filtering collections”的功能。如果您愿意,我可以使用您提到的实体制作示例应用程序。