كيف يمكنك إلقاء طاولة linqtoSql كجدول أين الخيمة: ientity؟
-
26-09-2019 - |
سؤال
أحاول استخدام DBLINQ مع قاعدة بيانات SQLITE ، لكنني أواجه مشكلة عندما أحاول إلقاء ملف ITable
ك Queryable<TEntity>
.
هناك خطأ معروف في DBLINQ (العدد 211) ، الذي قد يكون مصدر مشكلتي ، لكنني أردت التأكد من أن الكود الخاص بي سليم ، وإذا كان الأمر كذلك ، اكتشف ما إذا كان هناك شيء يمكنني القيام به لأعمل حول الخطأ.
فيما يلي طريقة المستودع العام الذي يحاول القيام بالممثلين:
public IQueryable<TEntity> GetAll()
{
return Table.Cast<TEntity>(); // Table is an ITable
}
هذا يجمع ، ولكن إذا مررت في الواجهة IPerson
ل TEntity
ونوع الكيانات في الجدول Person
(أين Person : IPerson
) ، أحصل على هذا الخطأ من dblinq:
S0133: تنفيذ querymethod queryable.cast.
لماذا أحاول أن أفعل هذا؟
لديّ مشروع مكتبة لا يعرف نوع الكيان حتى وقت التشغيل ، لكنه يعرف الواجهة الخاصة بالكيان. لذا ، أحاول أن ألقي نوع الواجهة حتى يتمكن مشروع المكتبة من استهلاك البيانات.
أسئلة:
- هل أحاول فريقًا مستحيلًا أم أن هذا بالتأكيد خطأ في DBLINQ؟
- وإلا كيف يمكنني القيام بحل مشكلتي؟
تحديث
قمت بإعادة صياغة فصل المستودع الخاص بي حتى يستغرق الأمر الآن TEntity
و أ TEntityBase
, ، أين TEntity
هو النوع الفعلي للكيان ، و TEntityBase
هي الواجهة التي أحاول إلقاؤها. الأهم من ذلك ، لدي الآن ما يلي where
بند في تعريف الفصل:
where TEntity : class, TEntityBase
هذا يسمح لي بتخزين بلدي Table
الملكية ك Table<TEntity>
بدلا من ITable
, الذي يسمح لي بالاستخدام AsEnumerable()
(كما اقترح ستيفن). ها هي الطريقة المنقحة:
public IEnumerable<TEntityBase> GetAll()
{
return Table.AsEnumerable().Select(e => (TEntityBase)e);
}
وحتى الآن ، ذلك يبدو للقيام بالخدعة.
المحلول
يبدو الأمر وكأنه خطأ ، ولكن نفهم أن تطبيق مزود LINQ هو مسعى ضخم للغاية. حتى (Microsoft) LINQ إلى SQL و LINQ للكيانات لديها قيودها الخاصة على بالضبط استعلامات/عمليات LINQ التي تدعمها أو لا تدعمها.
إذا عدت IEnumerable<T>
مقبول ، ثم يمكنك العمل حول عدم وجود دعم Queryable.Cast
بالاتصال AsEnumerable
قبل الاتصال Cast
. ومع ذلك ، فإن هذا يقيد كيفية استخدام DAL الخاص بك: منذ ذلك الحين IQueryable<T>
لم يعد يتم إرجاعه ، استفسارات أخرى (على سبيل المثال ، Where
لن يتم تمرير الجمل) إلى طبقة DB.
نصائح أخرى
أوافق على أنه يبدو وكأنه خطأ. يمكنك تجربة ما يلي الذي سيفعل نفس الشيء
return Table.Select<TEntity>(tbl => (TEntity)tbl)
قد تضطر إلى إضافة مكان: إنه قابل للتعريف أيضًا.