我有一个有很多关系映射的类。 应该为具体用户提取其中一个关系。
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
列表,以供具体用户使用。
答案 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”的功能。如果您愿意,我可以使用您提到的实体制作示例应用程序。