0

LLBLGEN ORM を使用する「機会」があります。複数のテーブルに対して JOIN コマンドをクエリしようとして、すでに 2 日間を費やしました (成功しませんでした)。今家にいる私は、小規模なプロジェクトでこの ORM のロジックを理解しようとしています (つまり、採用担当者 -> 求人者 -> 候補者)。それでも、このソフトウェアは私のお尻を怒らせています。そこで私はドキュメンテーションに行き、いくつかの知識を得ようとしましたが、残念ながら成功しませんでした。

だから私はここで尋ねています、 LLBLGEN の非常に基本的な使用法を簡単に説明する本当のダミーのチュートリアルはどこかにあります:

  • どこで(わかりました、これはすでにカバーしています)
  • 加入
  • マルチジョイン

たぶん誰かがコードとデータベースを持っていて、この概念を共有してわかりやすい方法で説明することができます。

ありがとう!

4

2 に答える 2

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 テーブルと 1 対多の関係を持つ Customer テーブルがある場合、対応するエンティティには、それらの関係を含む静的な Relations プロパティがあります。

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

結合を実行し、結合に基づいて結果を返す場合は、これらの関係を使用します。たとえば、varlue が 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

複数の結合の場合、リレーションを追加するだけで、数量が 1 より大きい OrderDetail を持つ 50000 より大きい値の注文を持つ顧客を取得できます。

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 に答える
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 に答える