我经常从我的同事那里听到“笛卡尔积”这个词,因为有一个领域模型在一个集合中包含一个集合并且渴望获取相同的集合。假设我有以下模型。
public class Order{
List<Product> Products
}
public class Product{
List<Units> Units
}
现在他们说,如果我尝试用产品和单位获取订单,我应该得到一个笛卡尔产品(又名重复..)。但是当我通过启用 ShowSql 对其进行测试时,我似乎没有得到任何重复。这是我的存储库类
public List<Order> GetOrdersWithProductsAndUnits()
{
return GetSession().Query<Order>()
.FetchMany(order => order.Products)
.ThenFetch(product => product.Units)
.ToList();
}
这是启用 ShowSql 的 sql 输出。这似乎很好,并且与必要表上的连接一致。
select order0_.Id as Id8_0_,
childstock1_.Id as Id23_1_,
childstock2_.Id as Id24_2_,
order0_.CustomerName as Customer2_8_0_,
order0_.City as City8_0_,
childstock1_.Size as Size23_1_,
childstock2_.Box as Box24_2_,
from Orders order0_
left outer join Products childstock1_ on order0_.Id=childstock1_.OrderId
left outer join Units childstock2_ on childstock1_.Id=childstock2_.ProductId
我的数据库中有 125 个订单,当我急切地获取带有产品和单位的订单时,我仍然得到 125 条记录。
List<Order> orders = repository.GetOrdersWithProductsAndUnits();
Assert.That(orders.Count,Is.EqualTo(125));
此外,当我通过 Visual Studio 调试器检查时,我也没有在产品或单元级别的订单集合中找到任何重复项。
由于笛卡尔积导致重复,我期望数据库中的订单数与单位数一样多(接近 1000)。我是否遗漏了一些琐碎的事情,我对笛卡尔积的理解是否有偏差?或者我正在使用的查询 API 是否会自动解决笛卡尔积问题。
仅供参考:我也确定数据设置。我已经通过 Visual Studio 调试器进行了调试,我注意到具有多个产品的订单和具有多个单元的产品。
任何帮助/参考材料表示赞赏。
谢谢