سؤال

لدي استعلام Linq المعين مع إطار الكيان الذي يبدو مثل هذا:

image = this.Context.ImageSet
                    .Where(n => n.ImageId == imageId)
                    .Where(n => n.Albums.IsPublic == true)
                    .Single();

هذا إرجاع كائن صورة واحدة ويعمل على النحو المقصود.

ومع ذلك، يقوم هذا الاستعلام بإرجاع جميع خصائص جدول الصور الخاص بي في DB. في ظل الظروف العادية، سيكون هذا جيدا ولكن هذه الصور تحتوي على الكثير من البيانات الثنائية التي تستغرق وقتا طويلا جدا للعودة.

أساسا، في تكنولوجيا المعلومات الحالية هو استعلام LINQ الخاص بي يفعل:

Select ImageId, Name, Data
From Images
...

لكنني بحاجة إلى استعلام يقوم بهذا الصدم:

Select ImageId, Name
From Images
...

إشعار أريد تحميل كل شيء باستثناء البيانات. (يمكنني الحصول على هذه البيانات على مرور ASYNC الثاني)

هل كانت مفيدة؟

المحلول

لسوء الحظ، إذا كنت تستخدم LinQ إلى SQL، فلا يوجد حل مثالي.

لديك 3 خيارات:

  1. يمكنك إرجاع الكيان، مع تتبع السياق، وكل شيء، في هذه الحالة صورة، مع جميع الحقول
  2. اخترت الحقول الخاصة بك وإرجاع نوع مجهول
  3. اخترت الحقول الخاصة بك وإرجاع فئة مخصصة مكتوبة بشدة، لكنك تفقد تتبع، إذا كان هذا ما تريد.

أحب Linq إلى SQL، ولكن هذا هو الطريق.

الحل الوحيد الخاص بي هو إعادة هيكلة قاعدة البيانات الخاصة بك، ونقل جميع البيانات الكبيرة إلى جدول منفصل، وربطها من جدول الصورة.

بهذه الطريقة عند إرجاع الصورة التي ترغب فيها فقط إلى إرجاع مفتاح في حقل DataID الجديد، ثم يمكنك الوصول إلى تلك البيانات الأثقل عندما وإذا كنت بحاجة إليها.

في صحتك

نصائح أخرى

سيؤدي ذلك إلى إنشاء صورة جديدة مع مجموعة الحقول فقط. عند العودة للحصول على بيانات للصور التي تحددها، أقترح المضي قدما والحصول على مجموعة البيانات الكاملة بدلا من محاولة دمجها باستخدام بيانات المعرف / الاسم الموجود. من المفترض أن حقول المعرف / الاسم صغيرا بالنسبة للبيانات، وسوف يكون الرمز أبسط بكثير من محاولة القيام بالدمج. أيضا، قد لا يكون من الضروري إنشاء كائن صورة، باستخدام نوع مجهول قد يناسب أغراضك أيضا.

image = this.Context.ImageSet
                    .Where(n => n.ImageId == imageId)
                    .Where(n => n.Albums.IsPublic == true)
                    .Select( n => new Image { ImageId = n.ImageId, Name = n.Name }
                    .Single();

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

سؤال لكم جميعا: هل يعرف أي شخص ما إذا كانت أطر الكيان تدعم تأخر Varbinary / varchar's في MSVS 2010؟ أذى

الحل رقم 2 (لإطار الكيان أو LINQ 2 SQL):

قم بإنشاء طريقة عرض على الجدول الذي يتضمن المفتاح الأساسي فقط و varchar (max) / varbinary (بحد أقصى). خريطة ذلك في EF.

ضمن مصمم إطار عملك، احذف خاصية Varbinary (Max) / Varchar (MAX) من تعريف الجدول (تركها محددة فقط في العرض). يجب أن يستبعد هذا الحقل من عمليات القراءة / الكتابة إلى هذا الجدول، على الرغم من أنك قد تحقق ذلك مع المسجل.

عموما، ستقوم بالوصول إلى البيانات من خلال الجدول الذي يستبعد Data Blob. عندما تحتاج إلى Blob، يمكنك تحميل صف من العرض. لست متأكدا مما إذا كنت ستتمكن من الكتابة إلى الرأي، لست متأكدا من كيفية تكتب. قد تتمكن من الكتابة إلى العرض، أو قد تحتاج إلى كتابة إجراء مخزن، أو يمكنك تمثال نصفي ملف DBML لجدول واحد.

لا يمكنك أن تفعل ذلك Linq. على الأقل لغاية الآن...

أفضل نهج أعرفه هو خلق View للجدول الذي تحتاجه دون حقول كبيرة واستخدام Linq. مع ذلك View.

بدلا من ذلك، يمكنك استخدام تحديد جديد في تعبير الاستعلام ...

var image =
(
    from i in db.ImageSet
    where i.ImageId == imageId && i.Albums.IsPublic
    select new
    {
        ImageId = i.ImageId,
        Name = i.Name
    }
).Single()

يتم تحويل تعبيرات الاستعلام LinQ في الواقع إلى تعبير Lambda في وقت الترجمة، ولكني برئ باستخدام تعبير الاستعلام بشكل عام لأنني أجدها أكثر قابلية للقراءة ومفهومة.

شكرا :)

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