سؤال

هل من الممكن اختيار الأعمدة التي أريدها في المقابل من الجلسة. createcriteria ()؟

egz.:

var x = session.CreateCriteria();
    x.CreateAlias("EmployeePosition", "employeePosition");
    x.Add(Restrictions.Eq("employeePosition.Name", "Developer"));

وهل هناك طريقة لإضافة شيء مثل "Select LastName" لتجنب تنزيل الصف بالكامل.

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

المحلول

قم بعمل فئة تحتوي على الخصائص التي تحتاجها فقط ، وغالبًا ما تكون هذه فئة ملخصة مثل {id ، label} وستعيد استخدامها في أي مكان تحتاج إلى نوع بسيط ، في قائمة على سبيل المثال. استخدم قائمة الإسقاط لتحديد الأعمدة التي يجب إرجاعها. ثم استخدم Transformers.AliastoBean لتحويل النتيجة إلى نوعك البسيط.

ProjectionList projectionList = Projections.ProjectionList();
projectionList.Add(Projections.Property("EmployeeID"), "Id");
projectionList.Add(Projections.Property("EmployeePosition"), "Label");
var x = DetachedCriteria.For(Employee);
x.SetProjection(projectionList);
x.SetResultTransformer(Transformers.AliasToBean(SimpleType)));
return x.GetExecutableCriteria(UnitOfWork.CurrentSession).List<SimpleType>();

نصائح أخرى

يمكنك القيام بذلك باستخدام التوقعات:

IList<Object[]> list = session.CreateCriteria(typeof(Employee))
  .SetProjection(Projections.ProjectionList()
    .Add(Projections.Property("FirstName"))
    .Add(Projections.Property("LastName"))
  ).List<Object[]>();

  foreach( Object[] person in list )
  {
    String firstName = person[0];
    String lastName = person[1];
  }

تحقق من مساحة اسم nhibernate.expressions لإسقاطات أخرى أيضًا.

أود أن أقترح إعطاء LINQ ل nhibernate تجربة. سوف يتيح لك أن تفعل ما تطلبه بطريقة طبيعية للغاية.

إضافة إلى دانا الإجابة ، إذا كان لديك فئة فعلية تريد قراءتها ، فيمكنك أيضًا استخدام Transformers.AliastoBean مع الإسقاط. سيحاول Nhibernate بعد ذلك ملء خصائص الكائن مع قيم من أسماء الحقول المطابقة.

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