2011-08-28 97 views
1

对于一对一的关系,事情很简单。
当涉及到一对多或多对多的问题出现...
我没有使用ORM工具现在有很多原因,我想知道我什么时候想要获取数据是否更好地重新组合一对多使用多个查询或代码的关系..从关系数据库映射

例如..有一个类类别和一类产品...

的产品表中有类别ID的collumn(一类许多产品)。

因此,我的完整目录是执行2个查询来获得我想要的类别和产品,然后为每个类别填充其产品列表最好? (这对于LINQ来说非常简单)..

或者我应该为每个类别调用查询?像select id from products where category_id=5;

而且我不知道如何来命名的功能,如设置是否我想获取关系的对方或不..

回答

1

如果要检索所有类别及其所有产品,可以选择所有类别,然后在两个查询中选择所有产品,也可以选择一个查询和组。

在使用时只需一个查询,选择内部联接为你的两个表

SELECT c.*, p.* 
FROM Category c INNER JOIN Product p ON c.CategoryId = p.CategoryId 

,然后从所得到的数据集

result.GroupBy(r => r.CategoryId).Select(group => 
    new Category(/* new Category using c.* columns */) 
    { 
     Products = /* new list of Products from p.* values */ 
    }); 

构建的业务对象,但我要问 - 为什么不是活得你使用ORM吗?

+0

我没有时间学习它需要在.NET中的曲线。我习惯于Java ORM,但它们太复杂了。连接查询不会导致太多重复的数据? – GorillaApe

+0

它会导致重复的数据,但更少的查询。这取决于您从目录表中检索多少列 - 将按总数的比例重复多少数据?如果这是一个问题,那么你应该基准。 –

2

你应该总是使用可能的查询次数最少的检索您的数据。每个类别执行一个查询以加载产品称为N + 1问题,并且可能会在您的代码中快速造成瓶颈。

至于如何命名指定您的提取计划的方法,请在方法实际执行后指定它们,例如IncludeProducts或WithProducts。

+0

withProducts是我做的事情,但没有看到它在任何地方.. – GorillaApe