بحاجة إلى مساعدة في تحويل SQL إلى معايير API
-
08-07-2019 - |
سؤال
لدي NHibernate التطبيق حاليا يجعل من استخدام SQL Server دالة معرفة من قبل المستخدم.وأود أن تجنب الاضطرار إلى استدعاء هذه الدالة ، و بدلا من ذلك يعرب عن المنطق باستخدام NH معايير API.للأسف أنا أعاني من صعوبة في تطبيق معايير الأمثلة في NH الوثائق إلى حالة معينة.لذلك أنا يلتفت إلى هذا الموقع للحصول على مساعدة.
هنا هي وظيفة.فإنه يأخذ سلسلة واحدة الحجة وإرجاع الجدول.وظيفة ينفذ 3 ينضم بين نفس الجداول 2 ولكن مع اختلاف الانضمام إلى معايير ، ثم يلتئم النتيجة.
أي تلميحات سيكون موضع تقدير.شكرا مقدما!
تحرير: هذا هو استهداف NH 2.1
تحرير: تعليق في الجواب المقبول أن التحويل غير ممكن ، وهو الصحيح الجواب.
CREATE FUNCTION dbo.GetRevisionText
(
@LangId NVARCHAR(16)
)
RETURNS TABLE
AS
RETURN
(
SELECT r.RevisionId,
COALESCE(lp1.Title, lp2.Title, lp3.Title) Title,
COALESCE(lp1.Description, lp2.Description, lp3.Description) Description
FROM Revision r
LEFT JOIN LocalizedProperty lp1
ON lp1.RevisionId = r.RevisionId
AND lp1.LanguageId = @LangId
LEFT JOIN LocalizedProperty lp2
ON lp2.RevisionId = r.RevisionId
AND lp2.LanguageId = LEFT(@LangId, 2)
LEFT JOIN LocalizedProperty lp3
ON lp3.RevisionId = r.RevisionId
AND lp3.LanguageId = r.DefaultPropertiesLanguage
);
هنا هو تعيين 3 فئات المعنيين :
<class name="Revision">
<id name="RevisionId" type="Guid">
<generator class="assigned"/>
</id>
<set name="LocalizedProperties" inverse="true" lazy="true" cascade="all-delete-orphan">
<key column="RevisionId"/>
<one-to-many class="LocalizedProperty"/>
</set>
<many-to-one name="DefaultPropertiesLanguage" class="Language" not-null="true"/>
</class>
<class name="Language">
<id name="LanguageId" type="String" length="16">
<generator class="assigned"/>
</id>
<property name="Lcid" type="Int32" unique="true" not-null="true"/>
</class>
<class name="LocalizedProperty" mutable="false">
<composite-id>
<key-many-to-one name="Revision" class="Revision" column="RevisionId"/>
<key-many-to-one name="Language" class="Language" column="LanguageId"/>
</composite-id>
<property name="Title" type="String" length="200" not-null="true"/>
<property name="Description" type="String" length="1500" not-null="false"/>
</class>
المحلول
هذا يمكن القيام بهذه المهمة (NH 1.2):
var crit = nhSes.CreateCriteria(typeof(Revision), "r")
.SetProjection(
Projections.SqlProjection(@"r.RevisionId as rid,
COALESCE(lp1.Title, lp2.Title, lp3.Title) as Title,
COALESCE(lp1.Description, lp2.Description, lp3.Description) as Description", new[] {"rid", "Title", "Description"}, new[] {NHibernateUtil.Guid, NHibernateUtil.String,NHibernateUtil.String})
);
crit.CreateCriteria("LocalizedProperty", "lp1", JoinType.InnerJoin);
crit.CreateCriteria("LocalizedProperty", "lp2", JoinType.InnerJoin);
crit.CreateCriteria("LocalizedProperty", "lp3", JoinType.InnerJoin);
crit.Add(Expression.Eq("lp1.LanguageId", langId));
crit.Add(Expression.Sql("lp2.LanguageId = LEFT(:LangId, 2)", langId, NHibernateUtil.String));
crit.Add(Expression.EqProperty("lp3.LanguageId", "r.DefaultPropertiesLanguage"));
ومع ذلك لاحظ أن هذا لا تولد ANSI جملة الانضمام ولكن يضع القيود في جملة WHERE.أنا حقا لا أعتقد أن هناك مشكلة تقومون به صلة داخلية لا صلة خارجية.
أيضا أنا لا أتذكر الآن السليم المعلمة التأشير على Expression.Sql
.لقد بأنه :LangId
على الرغم من أنه قد يكون أيضا @LangId
وي:كما يمكنك أن ترى على الرغم من أن هذا هو معايير الاستعلام فقط مجموعة من البيانات sql الانقسام حتى تتناسب مع معايير API ؛ هل أنت متأكد أن هذا هو ما تحتاج ؟