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

我认为您的问题的前提是错误的:您没有在左外连接上映射对象。您可以使用外键引用将它们映射到数据库中,或者使用类映射在 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;}
}

你有一些 Company 对象,它设置了一个地图,给它一个 id 字段。这是您与股票和公司的简单父子 ID 类型关系。我假设。hibernate 和 nhibernate 背后的想法是您不必在对象中包含 id 引用。它为您处理

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

您所说的您希望查询执行的操作有些模棱两可,但您似乎想要列出所有股票,并且当该股票由某个所有者拥有时,该股票的公司也是如此。另一种可能性是您想要列出所有公司,并且当它们拥有特定 ID 拥有的股票时,也列出该股票。

无论哪种情况,您都需要一个简单的左连接查询。在流利的 bhibernate 中,这些看起来像这样

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 回答
0

您可以使用称为“过滤集合”的功能。如果您愿意,我可以使用您提到的实体制作示例应用程序。

于 2012-05-02T22:23:20.430 回答