کوئری زدن در NHibernate


سلام می خوام روش سریع کوئری زدن روی ان هایبرنیت رو بنویسم
چندین روش برای اجرای کوئری وجود داره که ساده ترینش به این شکل هست

[sourcecode language=”csharp”]
int userId =12;
using (ISession session = NHibernateHelper.OpenSession())
{
var result = session
.CreateCriteria(typeof(Question_Domain))
.Add(Restrictions.Eq(“UsersId”, userId))
.List<Question_Domain>();
return result;
}
[/sourcecode]

ما روی جدول پرسش ها کوری زدیم برای پیدا کردن یک یوزر آی دی خاص
اسم دامین رو بهش میدیدم
[sourcecode language=”csharp”]
.CreateCriteria(typeof(Question_Domain))
[/sourcecode]
یک محدودیت ایجاد می کنیم به این صورت که پارامتر اول که اسم فیلد جدول هست باید با پارامتر دوم که یک متغییر هست برابری کنه
[sourcecode language=”csharp”]
.Add(Restrictions.Eq(“UsersId”, userId))
[/sourcecode]
و در آخر
[sourcecode language=”csharp”]
.List<Question_Domain>();
[/sourcecode]
نوع خروجی رو مشخص می کنه

روش دوم برای کوئری زدن اچ کیو ال هست که یه زبان شبیه به اس کیو ال مخصوص ان هایبرنیت هست

راهنمای کاملش در این آدرس هستش

http://nhforge.org/doc/nh/en/index.html#queryhql
مثال عملی

[sourcecode language=”csharp”]
string q =”search key”;
using (ISession session = NHibernateHelper.OpenSession())
{
var result = session
.CreateQuery(“from Cell.Cell_Race.DAL.Domain.Tiket_Domain “+
“where (( TiketPublic = true ) and “+
” (TiketAnswer like ‘%”+q +”%’ or TiketText like ‘%”+q+”%’ or TiketTitle like ‘%”+q+”%’))”)

.List<Tiket_Domain>();
}
[/sourcecode]

بسیار بسیار کاربردی و جالبه
[sourcecode language=”csharp”]
.CreateQuery(hqlQuery)
[/sourcecode]
آدرس کلاس دامین
[sourcecode language=”csharp”]
from Cell.Cell_Race.DAL.Domain.Tiket_Domain
[/sourcecode]
و بعدی هم اسامی فیلد
و الی آخر
روش بعدی که قدرت ان هایبرنیت رو چندین برابر می کنه کوئری اس کیو ال مستقیم هستش

یک مثال جالب از سورس های خودم

[sourcecode language=”csharp”]
List<Tiket_Domain> finalResult= new List<Tiket_Domain>();
var result = session
.CreateSQLQuery(” select * from Tiket ” +
“where (( Tiket_Public = 1 ) and ” +
” (Tiket_Answer like N’%” + q + “%’ or Tiket_Text like N’%” + q
+ “%’ or Tiket_Title like N’%” + q + “%’))”)
.List<object[]>();
foreach (object[] res in result)
{
finalResult.Add(
new Tiket_Domain((int)res[0],
(res[1] == null ? null : res[1].ToString()),
(res[2] == null ? null : res[2].ToString()),
(res[3] == null ? null : res[3].ToString()),
(res[4] == null ? null : res[4].ToString()),
(bool?)res[5],
(res[6] == null ? null : res[6].ToString()),
(bool?)res[7], (DateTime?)res[8]));
}
return finalResult;
[/sourcecode]

خیلی قشنگ کوئری می گیرین و نوع برگشتی که آرایه ای از آبجکت هست رو با یه فور تبدیل می کنید و بر می گردونید

دستور اصلیش همین هست

[sourcecode language=”csharp”]
.CreateSQLQuery(” select * from Tiket ” +
“where (( Tiket_Public = 1 ) and ” +
” (Tiket_Answer like N’%” + q + “%’ or Tiket_Text like N’%” + q
+ “%’ or Tiket_Title like N’%” + q + “%’))”)
.List<object[]>();
[/sourcecode]

چون من با لایک زدن با زبان فارسی مشکل داشتم البته نوع کالیشن دیتا بیس من از نوع

SQL_Latin1_General_CP1_CI_AS
بود که به مشکل خورد روش کوئری اچ کیو ال و اگر نوع کولیشن دیتابیس من از نوع زیر بود
Arabic_CI_AS
همون دستور اچ کیو ال روش کار می کرد و نیاز به تبدیل و کوئری مستقیم نبود

یه وبلاگ جالب

http://www.rjp-software.co.uk/category/nhibernate/

یه مطلب کامل

http://ayende.com/blog/4023/nhibernate-queries-examples


About admin

مهندس ناصر نیازی متولد وساکن روستای قایش شهرستان رزن استان همدان در 2 امین روز سال 67 و برنامه نویس و طراح وبسایت

‎پیام بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *