nhibernate Query Createriora
-
27-09-2019 - |
سؤال
هل من الممكن اختيار الأعمدة التي أريدها في المقابل من الجلسة. 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 بعد ذلك ملء خصائص الكائن مع قيم من أسماء الحقول المطابقة.