بحاجة إلى مساعدة في تحويل SQL إلى معايير API

StackOverflow https://stackoverflow.com/questions/1815788

  •  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 ؛ هل أنت متأكد أن هذا هو ما تحتاج ؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top