سؤال

لدي Linq إلى كيانات الاستعلام مثل هذا واحد:

var results = from r in entities.MachineRevision
              where r.Machine.IdMachine == pIdMachine
                 && r.Category == (int)pCategory
              select r;

عادة انا استخدم التعليمات البرمجية أدناه للتحقق إذا كان بعض النتائج التي يتم إرجاعها:

if (results.Count() > 0)
{
    return new oMachineRevision(results.First().IdMachineRevision);
}

ولكن أنا الحصول على NotSupportedException في إذا الشرط.

رسالة الخطأ: غير قادر على إنشاء قيمة ثابتة من نوع 'نوع الإغلاق'.فقط أنواع بدائية ('مثل Int32 ، سلسلة ، Guid') معتمدة في هذا السياق.

علما بأن pCategory هو نوع التعداد.

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

المحلول

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

حاول القيام باختيار أول كيان في الاستعلام نفسه باستخدام FirstOrDefault ومن ثم تحقق إذا كانت النتيجة هي null.

int compareCategory = (int)pCategory; // just a guess
var result = (from r in entities.MachineRevision
              where r.Machine.IdMachine == pIdMachine
                 && r.Category == compareCategory
              select r).FirstOrDefault();

if (result != null)
{
     return new oMachineRevision(result.IdMachineRevision);
}

نصائح أخرى

لماذا لا مجرد استخدام FirstOrDefault() بدلا من ذلك ، والتحقق فارغة?لا أرى فائدة في الاستعلام عن العد ثم أخذ العنصر الأول.

في مستوى تنفيذ linq المشغلين "حدد" و "أين" خريطة طرق إعادة IEnumerable أو IQueryable.حتى القياسية linq أساليب عندما تستخدم دائما إعادة IEnumerable من الاستعلام الخاص بك ليس كائن واحد.

ولكن linq الأساليب التي هي المرشحين linq مشغلي لا تقتصر أساليب العودة IEnumerables ، أي طريقة إرجاع أي شيء يمكن أن يكون اختيار.

في حال كان لديك على سبيل المثال أساليب اسمه "حدد" و "أين" أن عودة كائن واحد أو امتداد طرق محددة إلى فئة والعودة كائن واحد الذين سيتم استخدامها بدلا من معيار ينق منها.

تخميني هو أن إما "حدد" أو "حيث" طريقة محددة في صفك هو جعل ينق ترجع قيمة واحدة بدلا من IEnumerable<T>.

لم أكن أعرف مختلفة مجهول الكائنات تنشأ اعتمادا على نتيجة الاستعلام.اعتقد انهم يريدون فقط أن تكون النتائج من نوع IEnumerable

كيف حول استخدام foreach?

var results = from r in entities.MachineRevision
              where r.Machine.IdMachine == pIdMachine
                 && r.Category == pCategory
              select r;

foreach( var r in results )
{
    yield return new oMachineRevision( r.IdMachineRevision );
}

وهذا ينطبق على جميع الضمني أنواع أيضا.يجب أن أعترف أنني نسيت هذا و هكذا جئت عبر هذا المنصب.

إذا كان لديك

class ClassA {
               ...

               private string value;

               ...

               public static implicit operator string(ClassA value)
               {
                    return value.ToString();
               } 

              ...
}

تحتاج إلى explictly يلقي الفئة astring للمقارنة.

لذا عادة ما تفعل هذا

    var myClassAStr = myClassA.ToString();

    var x = (from a in entites where a.ValToCompare == myClassAStr select a).first();

// do stuff with x
    ...

حاول استخدام

IENumerable<MachineRevision> results = from r in entities.MachineRevision
...

بدلا من ذلك.

أعتقد فار التي تسبب المشكلة.

تحرير:

قراءة رسالة الخطأ."غير قادر على خلق قيمة ثابتة من نوع 'نوع الإغلاق'.فقط أنواع بدائية ('مثل Int32 ، سلسلة ، Guid') معتمدة في هذا السياق".

واحدة من هذه comparisions هو مع النوع الذي لا int, string أو guid.أعتقد أن الفئة.

r.Machine.IdMachine == pIdMachine && r.Category == pCategory

ومن المثير للاهتمام ، LinqToSql سيسمح هذا البناء.لا أعرف لماذا LinqToEntities لا يدعم هذا.

أعتقد أنك يمكن أيضا حدد العنصر الذي تريد آخر أبسط طريقة باستخدام تعبيرات لامدا.

var result = entities.MachineRevision
                 .Where(x => x.Machine.IdMachine == pIdMachine)
                 .Where(y => y.Category == (int)pCategory)
                 .FirstOrDefault();

if (result != null)
{
     return new oMachineRevision(result.IdMachineRevision);
}

ثم تمضي كما تفعل عادة

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