0

我有一个使用 LLBLGEN ORM 的“机会”,我已经花了两天时间尝试在多个表上查询 JOIN 命令(没有任何成功)。现在在家里,我也试图了解这个 ORM 在较小项目上的逻辑(即招聘人员-> 工作机会-> 候选人)。然而,这个软件让我大吃一惊。所以我去了文档并试图从中获取一些知识,不幸的是没有任何成功。

所以我在这里问,是否有一个真正的傻瓜教程可以轻松解释 LLBLGEN 的基本用法:

  • 在哪里(好的,我已经涵盖了这个)
  • 加入
  • 多连接

也许有人有一些代码和数据库,可以以友好的方式分享和说明这些概念。

谢谢!

4

2 回答 2

1

连接使用 Relation 对象表示。如果您想检索特定招聘人员的所有候选人,您可以编写类似这样的内容,假设表具有正确的外键关系

var list = new CandidateCollection();
var relationsToUse = new RelationCollection
{
  JobOfferEntity.Relations.CandidateEntityUsingCandidateId,
  RecruiterEntity.Relations.JobOfferEntityUsingJobOfferId
};
var filter = new PredicateExpression
{
  new FieldCompareValuePredicate(RecruiterFields.Id, ComparisonOperator.Equal, recruiterId)
};
list.GetMulti(filter, relationsToUse);
于 2014-09-14T17:07:12.477 回答
1

LLBLGen 中有一些核心概念,我将通过代码示例和等效的 Sql 查询来解释它们。

  1. Predicate、IPredicate 和 PredicateExpression:这些被翻译为 Where 子句。您可以将 PredicateExpression 视为一个复杂的谓词,它由几个用 AND 和 OR 连接的谓词组成。

注意:将下面的代码片段视为伪代码,因为我现在无法访问 LLBLGen。

    var pred = CustomerFields.Id == 5;
    new DataAccessAdapter.FetchEntityCollection(coll, new RelationPredicateBucket(pred));

这将大致转化为:

  SELECT * FROM Customer WHERE Id = 5

您可以使用 PredicateExpression 组合多个谓词:

   var predEx = new PredicateExpression();
   predEx.Add(CustomerFields.Id == 5);
   predEx.AddWithOr(CustomerFields.Name == "X");

相当于:

   SELECT * FROM Customer WHERE Id = 5 OR Name = 'X'
  1. 关系:关系表示数据库中的关系。生成的代码中的每个实体中都有一个关系属性,其中包含该实体的每个关系。例如,如果您有一个与您的 Order 表具有一对多关系的 Customer 表,则相应的 Entities 将具有包含这些关系的静态 Relations 属性:

    CustomerEntity.Relations.OrderEntityUsingCustomerId;OrderEntity.Relations.CustomerEntityUsingCustomerId;

当您想要执行连接并基于连接返回结果时,您可以使用这些关系。例如,如果您想获取订单价值大于 50000 的所有客户,请执行以下操作:

var pred = OrderFields.Value > 50000;
var rpb = new RelationPredicateBucket();
rpb.PredicateExpression.Add(pred);
rpb.Relations.Add(CustomerEntity.Relations.OrderEntityUsingCustomerId);//perform join

这将转化为:

SELECT C.* FROM Customer AS C JOIN Order AS O ON C.Id = O.CustomerId WHERE O.Value > 50000

对于多个连接,您只需添加更多关系,以获取具有大于 50000 的订单且 OrderDetail 的数量大于 1 的客户:

var pred = OrderFields.Value > 50000 & OrderDetailFields.Quantity > 1;
var rpb = new RelationPredicateBucket();
rpb.PredicateExpression.Add(pred);
rpb.Relations.Add(CustomerEntity.Relations.OrderEntityUsingCustomerId);//perform customer and order join
rpb.Relations.Add(OrderEntity.Relations.OrderDetailEntityUsingOrderId);//perform order and order detail join

这会产生这个 sql 查询:

SELECT C.* FROM Customer AS C JOIN Order AS O ON C.Id = O.CustomerId JOIN OrderDetail AS OD ON OD.OrderId = O.Id WHERE O.Value > 50000 AND OD.Quantity > 1
于 2014-09-14T17:41:47.663 回答