كيف يمكنك إلقاء طاولة linqtoSql كجدول أين الخيمة: ientity؟

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

سؤال

أحاول استخدام 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.

لماذا أحاول أن أفعل هذا؟

لديّ مشروع مكتبة لا يعرف نوع الكيان حتى وقت التشغيل ، لكنه يعرف الواجهة الخاصة بالكيان. لذا ، أحاول أن ألقي نوع الواجهة حتى يتمكن مشروع المكتبة من استهلاك البيانات.

أسئلة:

  1. هل أحاول فريقًا مستحيلًا أم أن هذا بالتأكيد خطأ في DBLINQ؟
  2. وإلا كيف يمكنني القيام بحل مشكلتي؟

تحديث

قمت بإعادة صياغة فصل المستودع الخاص بي حتى يستغرق الأمر الآن 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)

قد تضطر إلى إضافة مكان: إنه قابل للتعريف أيضًا.

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