سؤال

أحاول تحويل استعلام nhibernate التالي باستخدام مثيل ثنائيu003Ct> بدلا من ilist.

IList<AllName> allNames =
  (IList<AllName>)Session.CreateQuery(
  @"select new AllName(
  name.NameId, name.FirstName, origin.OriginId, origin.Description,
  name.Sex, name.Description, name.SoundEx
  ) from Name name join name.Origin origin")
  .SetFirstResult(skip)
  .SetMaxResults(pageSize);

تشغيل هذا أحصل على الخطأ التالي:-

غير قادر على إلقاء كائن من نوع 'nhibernate.impl.queryimpl' إلى الكتابة.

أعلم أنه يمكنني العودة

IList results = Sesssion.CreateQuery(...

لكن طبقات خدمتي تتوقع

IList<AllName>

كيف يمكنني تحقيق ذلك؟

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

المحلول

خيار واحد هو كتابة IList<T> تنفيذ الوكلاء إلى IList, ، يلقي عند الاقتضاء. لا ينبغي أن يكون من الصعب للغاية القيام به ، وإن كان مملاً إلى حد ما. سوف يجعل LINQ هذا أسهل قليلاً من حيث التنفيذ IEnumerable<T> إلخ - يمكنك فقط الاتصال بالمؤلف والاتصال الأساسي Cast<T>() على ذلك ، على سبيل المثال.

حل آخر هو إنشاء جديد List<T> من القائمة التي تم إرجاعها:

IList query = Session.CreateQuery(...);
IList<AllName> allNames = new List<AllName>(query.Cast<AllName>());

تحرير: كما يشير ساندر بحق ، هذا ما ToList هو ل:

IList query = Session.CreateQuery(...);
return query.Cast<AllName>().ToList();

تحرير: كل هذا كان nhibernate -agnostic ، كما كان - أنا لا أعرف في الواقع الكثير عن nhibernate. وجدت Rippo الآن إجابة أبسط بكثير - اتصل List<AllName> بدلا من ذلك (وهي طريقة nhibernate).

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