كيف يمكن لهذا مصمم الرسم Linq2SQL خلق التعداد في بند حدد؟

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

سؤال

ولقد حصلت على الاستعلام مصمم الرسم Linq2SQL التالي، وأنا وضع النتيجة إلى POCO. واحد من ممتلكاتي POCO هو التعداد.

public IQueryable<Models.Achievement> GetAchievements()
{
    return from a in _sqlDatabase.Achievements
        select new Models.Achievement
            {
                // Note: ToEnum is an extension method that converts an int -> the enum.
                AchievementType = a.AchievementTypeId.ToEnum<Models.AchievementType>(),
                DateTimeCreated = a.DateTimeCreated,
                UserId = a.UserId
            };
}

وعندما كنت تشغيل الاستعلام، وأحصل على الخطأ التالي.

System.NotSupportedException: Method 'Models.AchievementType 
    ToEnum[AchievementType](int)' has no supported translation to SQL.

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

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

المحلول

ويمكنك فعلا استخدام تتضمن التعدادات مباشرة في وLINQ إلى SQL (ولكن ليس إطار الكيان)؛ مجرد تغيير نوع العقار (في DBML / مصمم) إلى نوع التعداد مؤهل بشكل كامل، وانها لن تفعل المدلى بها بالنسبة لك. قد ترغب أن نسميها AchievementType، وبطبيعة الحال - وهذا يفترض على التوالي (الزهر) ترجمة

إذا هذا لا يتناسب مع السيناريو الخاص بك، ربما عليك لتحديده كعدد، ومن ثم القيام يلقي النهائي في وLINQ إلى كائنات (عبر AsEnumerable ()). يمكنك أيضا محاولة يلقي على التوالي (على افتراض هذا يكفي) بدلا من طريقة تمديد عام بك:

select new {..., AchievementType = (AchievementType) foo.Bar, ...}

وليس ذلك إذا تم تعريف نوع Models.Achievement في DBML، لا يمكنك إنشاء الامر بهذه الطريقة - عليك أن بسيطة تحديده. ولكن إذا لم يكن هذا جزءا من ديسيبل نموذج ثم فإنه على ما يرام. هنا 'سا سبيل المثال ذات الصلة لسلاسل رسم الخرائط لتتضمن التعدادات في LINQ -to-SQL.

إذا لم يكن أي من هذه الدعاوى، والنهج الآخر هو للإعلان عن الممتلكات التعداد كما الرقائق في فئة جزئية. أعطى مثالا على ذلك <وأ href = "https://stackoverflow.com/questions/353190/how-do-i-replace-an-int-property-with-an-enum-in-entity-framework#353195 "> هنا (لEF، لكنه يعمل نفسه)، ولكن لاحظ أنه إذا قمت بذلك، لا يمكنك استخدام الخاصية التعداد في بنود Where الخ، لأنه لم يتم تعيين في النموذج.

نصائح أخرى

وربما قد تتمكن من محاولة شيء من هذا القبيل فيكم إعلان Models.Achievement:

  AchievementType achievementType{
    get
      {
         return this.AchievementTypeId.ToEnum<Models.AchievementType>();
      }
      set
      {
        this.AchievementTypeId = (int)value;
      }
    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top