كيف يمكن لهذا مصمم الرسم Linq2SQL خلق التعداد في بند حدد؟
-
21-08-2019 - |
سؤال
ولقد حصلت على الاستعلام مصمم الرسم 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;
}
}