سؤال

كيف يمكنك بناء هذا الاستعلام مع إطار الكيان:

SELECT  *
FROM    TreeNodes
WHERE   data.value('(/edumatic/assessmentItem/@type)[1]', 'nvarchar(max)') like 'multiplechoice1'

عمود البيانات هو XML. يبدو أن هذا يتم تحويله إلى سلسلة من قبل إطار الكيان ...

هذا هو بداية بلدي ولكن من هنا لن أعرف كيفية إضافة المكان ...

var query = from e in edumatic3Context.TreeNodes
                        where e.Data.???????
                        select e;

            foreach (var treeNode in query)
                Console.WriteLine("{0} {1} {2} {3}", treeNode.TreeNodeId, treeNode.Name, treeNode.Type, treeNode.DateChanged);

لقد جربت أيضا شيئا مثل التعليمات البرمجية التالية ولكن هذا لم يعمل إما:

var sql = "SELECT VALUE treeNode FROM TreeNodes as treeNode WHERE data.value('(/edumatic/assessmentItem/@type)[1]', 'nvarchar(max)') like 'multiplechoice1'";
            var query = edumatic3Context.CreateQuery<TreeNodes>(sql);

foreach(...)
هل كانت مفيدة؟

المحلول

لا يوجد أي من لغات استعلام إطار الكيان (LINQ إلى كيانات و ESQL) دعم استفسارات XML المتداخلة. لذلك لن تكون قادرا على القيام بهذا النوع من الأشياء. ما لم تقم بتشغيل استعلام XML بعد مكالمة AsEnumerable(), ، والتي بالطبع غير مرغوب فيه إلى حد ما عن منظور الأداء.

بعد القول أنه ربما يمكنك كتابة وظيفة المتجر في SSDL التي يقوم بهذا المرشح لك.

افتح ملف edmx في محرر XML، وحاول إضافة عنصر ضمن قسم StorageModel (أي SSDL). ال <CommandText> (أعتقد أن هذا هو ما يطلق عليه) من وظيفة المتجر هذه هي المكان الذي يمكنك فيه كتابة T-SQL المناسب ويمكنك الرجوع إلى معلمات الوظيفة أيضا. آسف ليس لدي مثال على هذه المفيدة.

بعد القيام بذلك يمكنك استدعاء وظيفة المتجر في Esql، أي شيء مثل هذا:

SELECT VALUE treeNode FROM TreeNodes as treeNode WHERE 
StorageModelNamespace.MyXmlWrapperFunctionForNVarchar('(/edumatic/assessmentItem/@type)[1]', treeNode.Data) LIKE 'multiplechoice1'

في .NET 4.0 ستتمكن أيضا من كتابة وظيفة كعبية في .NET حتى تتمكن من الاتصال بهذه الوظيفة في LinQ أيضا:

بمعنى آخر

[EdmFunction("StorageModelNamespace", "MyXmlWrapperFunctionForNVarchar"]
public static string MyXmlHelper(string path, string data)
{
   throw new NotImplementedException("You can only call this function in a LINQ query");
}

ثم شيء مثل هذا:

var query = from e in edumatic3Context.TreeNodes
            where MyXmlHelper("(/edumatic/assessmentItem/@type)[1]", e.Data)
                 .StartsWith("multiplechoice1")
            select e;

يرجى ملاحظة أن جميع التعليمات البرمجية المذكورة أعلاه هو مجرد رمز pseudo لم أختبره بالفعل، فأنا أحاول فقط أن أساعدك في البدء.

أتمنى أن يساعدك هذا

اليكيال

فريق إطار عمل مدير البرنامج

نصائح أخرى

خيارين:

  1. اكتب Proc التي ترجع جميع البيانات المطلوبة لتعيين نوع الكيان، ووضع SQL الخاص بك هناك. يمكن أن تستخدم هذه الطريقة فهرس XML على خادم DB.
  2. استرداد البيانات الموجودة على العميل، ثم قم ببناء وثيقة XML واستخدام LinQ إلى XML. مريحة للمبرمج، ولكن لا يمكن استخدام فهرس XML.

لا يعرف Linq إلى الكيانات عن ميزات DB Server XML.

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