تريد نتيجة مكتوبة بقوة من JOIN في .netTiers
-
07-07-2019 - |
سؤال
نظرا لاستعلام مثل:
SELECT table1.field1 FirstField, table2.field2 SecondField
FROM table1
INNER JOIN table2 ON table1.FK = table2.PK
WHERE table1.somefield = 'somevalue';
هدفي هو إرجاع مجموعة نتائج مكتوبة بقوة باستخدام .netTiers.أفترض أنني لا أستطيع استخدام طريقة العرض لأن WHERE
تحتاج الجملة إلى معلمة، والتي لا يمكن تمريرها إلى طريقة عرض.يمكن تمرير الإجراء المخزن إلى المعلمة "somevalue" ولكنه يُرجع قيمة مكتوبة بشكل ضعيف DataSet
أو DataReader
.
أعتقد أنني أفتقد مفهومًا هنا.فقط لأكون واضحًا، ما أود أن ينتهي بي الأمر هو أن أكون قادرًا على كتابة شيء مثل هذا:
TList <some-entity-name> entityList = DataRepository.SomeProvider.Get( "somevalue" );
foreach ( some-entity-name entity in entityList ) {
DoSomethingWith( entity.FirstField, entity.SecondField );
}
أرغب في تجنب الحل الذي يتضمن عامل تصفية من جانب الخادم بعد تنفيذ الاستعلام؛الجداول المعنية كبيرة جدًا.
المحلول
وإنشاء طريقة عرض واستخدام الكائن ParameterBuilder كتبته بقوة لتصفية عرض على عمود معين. لا أستطيع أن أتذكر تماما ما هو هذا الكائن طبقة في.
وهذه هي الطريقة التي ستستخدم فيه:
MyViewParameterBuilder builder = new MyViewParameterBuilder();
builder.AppendEquals(TableColumn.Column, "value");
DataRepository.MyViewEntityProvider.Find(builder.GetParameters());
وقد أكون مخطئا، ولكن أنا لا أعتقد صافي-مستويات الواقع "مرشحات" الكائن / VLIST TList مع أسلوب أعلاه، وهو ما يوحي اسم الكائن. باني يولد هناك حيث يعمل بند وnettiers استعلام ضد قاعدة البيانات الخاصة بك باستخدام هذا الشرط.
و2nd الخيار الخاص بك هو لمحاولة توليد الإجراء المخزن، ولكن فقط إذا كان resultset ومن بروك المخزنة يطابق مخطط أحد الجداول في قاعدة البيانات الخاصة بك. وإلا فإن صافي-طبقات لا يعرف كيفية توليد ضدها. يمكنك قراءة المزيد حول هذا هنا
نصائح أخرى
إذا كنت تريد مجموعة TList ذات صلة، فستحتاج إلى إنشاء إجراء مخزن مخصص.الحل هنا: http://benpowell.org/paging-and-sorting-in-a-nettiers-custom-stored-procedure/
إذا كان لديك سيناريو مثل هذا:
- الحساب (معرف حساب PK)
- العميل (PK ClientId)
- ClientAccount (PK ClientId، AccountId)
طالما أن لديك الإعداد الصحيح للمفاتيح الخارجية، فسوف توفر لك NetTiers الطريقة المناسبة:
AccountService s = new AccountService();
TList<Account> accountCollection = s.GetByClientIdFromClientAccount(1);
هناك أيضًا طريقة محمّلة بشكل زائد تدعم الترحيل (للأسف لا توجد جملة orderBy).