PDA

View Full Version : سوال: وجود حالت های زیاد در جستجو



rezaei_y
جمعه 03 آبان 1392, 18:52 عصر
با سلام به دوستان عزیز

نمیدونم عنوان مناسبی انتخاب کردم یا نه؟چیز دیگه ای به ذهنم نرسید

نگاهی به فرم زیر بندازید
112221

در این فرم 6 چک باکس وجود داره که میشه انتخابشون کرد و بر اساس اون جستجو کرد
خوب با وجود 6 حالت که هرکدوم یا انتخاب شده یا خیر در کل 2 به توان 6 حالت یعنی 64 حالت پیش میاد
(البته توی این مثال یه کم کمتر چون بعضی حالت ها رو میشه نادیده گرفت)
حالا اگه یک فیلد دیگه هم اضافه بشه تعداد حالت ها میشه 128 تا
آیا راهی هست که بشه این جستجو رو از حالت نمایی درآورد؟

mmd2009
جمعه 03 آبان 1392, 19:01 عصر
با سلام.

از چه تکنولوژی ای برای برقراری با بانک اطلاعاتی استفاده می کنید ؟

موفق باشید

rezaei_y
جمعه 03 آبان 1392, 19:08 عصر
از Entity Framework استفاده میکنم

Mohammadm
جمعه 03 آبان 1392, 19:38 عصر
با سلام به دوستان عزیز

نمیدونم عنوان مناسبی انتخاب کردم یا نه؟چیز دیگه ای به ذهنم نرسید

نگاهی به فرم زیر بندازید
112221

در این فرم 6 چک باکس وجود داره که میشه انتخابشون کرد و بر اساس اون جستجو کرد
خوب با وجود 6 حالت که هرکدوم یا انتخاب شده یا خیر در کل 2 به توان 6 حالت یعنی 64 حالت پیش میاد
(البته توی این مثال یه کم کمتر چون بعضی حالت ها رو میشه نادیده گرفت)
حالا اگه یک فیلد دیگه هم اضافه بشه تعداد حالت ها میشه 128 تا
آیا راهی هست که بشه این جستجو رو از حالت نمایی درآورد؟

منظورتون از 64 یا 128 حالت چیه؟
به هرحال فقط یکی از این حالتها توی جستجو ایجاد میشه شاید من متوجه منظورتون نشدم
اما به این لینک نگاه کنید شاید بدردتون بخوره
http://barnamenevis.org/showthread.php?410872-جستوجوی-پیشرفته

mmd2009
جمعه 03 آبان 1392, 19:42 عصر
خب شما به دو روش میتونید اینکارو بکنید. ابتدا با استفاده از Dynamic Linq Query (http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx)هست که در همون لینک مثال زده شده که شما بر اساس نیازتون باید کوئری رو خودتون ایجاد بکنید و راه دوم استفاده از Predicate Builder (http://www.albahari.com/nutshell/predicatebuilder.aspx) هستش که مثلا بدین شکل باید استفاده کنید :


var predicateUsers = PredicateBuilder.True<Users>();
if(chkCity.checked)
{
predicateUsers=predicateUsers.And(x => x.city.Contains("myCity"));
}
if(chkCollege.checked)
{
predicateUsers=predicateUsers.And(x => x.College.Contains("myCollege"));
}
// and ....

var list=Users.Where(predicateUsers);


البته اگر یک خورده بیشتر در این مورد تلاش کنید میتونید اینهارو به صورت پویا خودتون ایجاد بکنید. کدهای بالا هم فقط جنبه آموزشی داشته و برای تست هستند.

موفق باشید

rezaei_y
جمعه 03 آبان 1392, 19:58 عصر
ممنون از دوستان


منظورتون از 64 یا 128 حالت چیه؟ببینید من چند تا حالت رو میگم:
1) لیست اساتید هیئت علمی
2) لیست اساتید با مرتبه علمی استادیار
3)لیست اساتید دارای تخصص برنامه نویسی
4)لیست اساتید هیئت علمی که مرتبه علمی آنها دانشیار است
5)لیست اساتید هیئت علمی که دارای تخصص برنامه نویسی هستند
6)لیست اساتید که دارای مرتبه علمی مربی و تخصص برنامه نویسی می باشند
7)لیست اساتید دارای تخصص برنامه نویسی و مرتبه علمی استادیار و نوع استخدام هیئت علمی هستند
8)لیست کلیه اساتید

خوب همانطور که دیدید برای سه تا فیلد ما 8 حالت داشتیم که اگه 4 فیلد بشه میشه 16 حالت و به صورت نمایی....



خب شما به دو روش میتونید اینکارو بکنید. ابتدا با استفاده از Dynamic Linq Query (http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx)هست که در همون لینک مثال زده شده که شما بر اساس نیازتون باید کوئری رو خودتون ایجاد بکنید و راه دوم استفاده از Predicate Builder (http://www.albahari.com/nutshell/predicatebuilder.aspx) هستش قبل از اینکه من کوئری رو ایجاد کنم باید بگم که از کدام حالت میخوام استفاده کنم 000001 یا 000010 و یا ...
من با کوئری مشکل ندارم
الان هم برنامه ام داره جواب میده
ولی واقعا از if else نوشتن خسته شدم
خواستم ببینم کسی ایده دیگه ای به ذهنش نمیرسه؟

بازم ازتون ممنونم

Mahmoud.Afrad
جمعه 03 آبان 1392, 22:05 عصر
نیاز نیست برای همه حالات if else بنویسید ، فقط کافیه به ازای هر مسخصه که در جستجو دخالت داره یک if بنویسید، در اینصورت فقط در صورتی در جستجو دخالت داده میشه که اون ورودی توسط کاربر انتخاب و وارد شده باشه یعنی برای 6 ورودی فقط 6 عدد if نیاز دارید نه 128 تا.

rezaei_y
جمعه 03 آبان 1392, 22:57 عصر
ممنون دوست عزیز متوجه نشدم

میشه برای موارد زیر که به ازای سه مشخصه در نظر گرفته شده با 3 if بنویسید

1) لیست اساتید هیئت علمی
2) لیست اساتید با مرتبه علمی استادیار
3)لیست اساتید دارای تخصص برنامه نویسی
4)لیست اساتید هیئت علمی که مرتبه علمی آنها دانشیار است
5)لیست اساتید هیئت علمی که دارای تخصص برنامه نویسی هستند
6)لیست اساتید که دارای مرتبه علمی مربی و تخصص برنامه نویسی می باشند
7)لیست اساتید دارای تخصص برنامه نویسی و مرتبه علمی استادیار و نوع استخدام هیئت علمی هستند
8)لیست کلیه اساتید

منظورم اینه که کاربر برای سه مشخصه میتونه 8 حالت انتخاب داشته باشه پس نیاز به 8 if پیدا میکنه

Mahmoud.Afrad
جمعه 03 آبان 1392, 23:34 عصر
بزارید اینطوری بگم : اگر بخواهید همین مسئله رو در sql بنویسید چه کار میکنید؟ آیا 128 حالت رو ایجاد میکنید؟ قطعا نه. در صورتی که ورودی توسط کاربر وارد شده باشه رشته SqlCommand رو اصلاح میکنید وگرنه به رشته کامند دست نمیزنید. در مثال mmd2009 (http://barnamenevis.org/member.php?115786-mmd2009) هم همینطور در صورتی که ورودی وارد شده باشه اون شرط در کوئری دخالت داده میشه.

این نمونه (http://barnamenevis.org/showthread.php?64210-%D9%86%D9%85%D9%88%D9%86%D9%87-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%87%D8%A7%DB%8C-%DA%A9%D9%88%DA%86%DA%A9-%D9%88-%D9%85%D9%81%D9%8A%D8%AF-%D8%AF%D8%B1-%D8%B3%D9%8A-%D8%B4%D8%A7%D8%B1%D9%BE&p=1565318&viewfull=1#post1565318) رو نگاه بنداز.

mmd2009
شنبه 04 آبان 1392, 00:41 صبح
ببینید شما در انتخاب نوع حالات اشتباه نمی کنید اما ایدتون باید با تعداد شرط ها خودکتر نوع حالا ایجاد میشن. همونطور که در بالا اشاره شد ، جستجوی ما بر اساس فیلد هست.

بذارید مسئله رو روشن تر بیان کنم. خب شما در بالا 8 مدل جستجو رو گفتید که در 3 فیلد جستو ها صورت میگیرن :

· نوع استخدام

· مرتبه علمی

· تخصص

که من همه فیلد ها رو براتون در نظر می گیر تا بهتر راهنمایی بشید.

· نوع استخدام

· مرتبه علمی

· تخصص

· دانشکده

· شهرستان

· استان

· استان محل خدمت

خب فرم شما هم اماده هست و 7 حالت رو داره و شرط با باید با استفاده از Predicate Builder باید بدین صورت باشه


var predicateOstad = PredicateBuilder.True<Ostad>();

if(chkNoeEstekhdam.checked)

{

predicateOstad = predicateOstad.And(d=>d.noeEstekhdam==”داده ای که کاربر انتخاب کرده”);

}

if(chkMartabeEmli.checked)

{

predicateOstad = predicateOstad.And(d=>d. MartabeEmli==”داده ای که کاربر انتخاب کرده”);

}



if(chkTakhasos.checked)

{

predicateOstad = predicateOstad.And(d=>d.Takhasos==”داده ای که کاربر انتخاب کرده”);

}

if(chkDaneshkade.checked)

{

predicateOstad = predicateOstad.And(d=>d.Daneshkade==”داده ای که کاربر انتخاب کرده”);

}

if(chkShahrestan.checked)

{

predicateOstad = predicateOstad.And(d=>d.Shahrestan==”داده ای که کاربر انتخاب کرده”);

}

if(chkOstan.checked)

{

predicateOstad = predicateOstad.And(d=>d.Ostan==”داده ای که کاربر انتخاب کرده”);

}

if(chkOstanMahaleKhedmat.checked)

{

predicateOstad = predicateOstad.And(d=>d.OstanMahaleKhedmat==”داده ای که کاربر انتخاب کرده”);

}




خب همونطور که می بینید فقط 7 شرط داریم حالا اینا به نظرتون انتخاب یا عدم انتخاب هرکدومشون چند حالت داره ؟



مثلا کاربر 3 چک باکس زیر رو تیم میزنه :

chkNoeEstekhdam و chkMartabeEmli و chkOstan

به عبارتی مثلا با این داده ها :

نوع استخدادم : هیئت علمی

مرتبه علمی : استادیار

استان : خوزستان



حالا Predicate Builder شما 3 شرط رو شامل شده و دستور Where ما بدین صورت میشه :

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

خب همونطور که می بینید فقط 7 شرط بیشتر نداریم برای 7 فیلدی که شما براشون چک باکس ایجاد کردید.

امیدوارم منظورم رو رسونده باشم.

موفق باشید

rezaei_y
شنبه 04 آبان 1392, 09:04 صبح
یک دنیا ممنون

حق با شماست با 6 تا if پیاده سازی میشه