LLBGen用于假人

本文关键字:假人 用于 LLBGen | 更新日期: 2023-09-27 18:21:44

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

所以我在这里问,有没有一个真正的假人教程可以很容易地解释LLBLGEN:的基本用法

  • 在哪里(好的,我已经搞定了)
  • 联接
  • 多重联接

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

谢谢!

LLBGen用于假人

连接使用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);

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

  1. 谓词、IPredcate和谓词表达式:它们被翻译成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. 关系:关系表示数据库中的关系。生成的代码中的每个实体中都有一个Relations属性,该属性包含该实体的每个关系。例如,如果您有一个与订单表具有一对多关系的客户表,则相应的实体将具有包含这些关系的静态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且订单详细信息数量大于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