PDA

View Full Version : سوال: جستجو در entity frame work



sonicuser
شنبه 25 بهمن 1393, 18:43 عصر
سلام دوستان من میخوام تو دیتا بیس جستجو کنم اما با چنتا شرط و در ضمن همه این شرطا باید بین 2 تاریخ باشه :متعجب: نمیدونم منظورمو رسوندم یا ن:متفکر:
این کدمه اگه میشه راهنمایی کنید:چشمک:
dataGridView1.DataSource = db.tbldetails.Where(i => i.ferstande == txtferestande.Text
|| i.girande == txtgirande.Text || i.maghsad == txtmaghsad.Text || i.bar == txtbar.Text
|| i.date <= en & i.date >= st ).ToList();

SabaSabouhi
شنبه 25 بهمن 1393, 19:03 عصر
سلام دوستان من میخوام تو دیتا بیس جستجو کنم اما با چنتا شرط و در ضمن همه این شرطا باید بین 2 تاریخ باشه :متعجب: نمیدونم منظورمو رسوندم یا ن:متفکر:
این کدمه اگه میشه راهنمایی کنید:چشمک:
dataGridView1.DataSource = db.tbldetails.Where(i => i.ferstande == txtferestande.Text
|| i.girande == txtgirande.Text || i.maghsad == txtmaghsad.Text || i.bar == txtbar.Text
|| i.date <= en & i.date >= st ).ToList();

سلام
1. تو خط آخر یه دونه & داری که فکر کنم منظورت && بوده باشه.
2. اگه ترکیبی از شرطهای && و || رو استفاده می‌کنی حتماً از () استفاده کن.
3. نام متغیرها یا ستون‌های دیتابیس رو پینگلیش نگذار. ناسلامتی ما برنامه‌نویس‌ها مدعی خیلی چیزها هستیم.

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

صبا صبوحی

sonicuser
شنبه 25 بهمن 1393, 19:11 عصر
ممنون :لبخندساده:
ببین میخوام رکوردهایی که تو اون بازه زمانی مشخصه و مثلا مقصد فلان جاست رو نشون بده
اما این کد فقط رکوردهایی که تو بازه en , st هست رو نشون میده و بقیه شرطا هیچ تاثیری نداره

SabaSabouhi
یک شنبه 26 بهمن 1393, 09:09 صبح
ممنون :لبخندساده:
ببین میخوام رکوردهایی که تو اون بازه زمانی مشخصه و مثلا مقصد فلان جاست رو نشون بده
اما این کد فقط رکوردهایی که تو بازه en , st هست رو نشون میده و بقیه شرطا هیچ تاثیری نداره

سلام
پس اشکال کارت در چیدمان شرط‌ها هست. شما وقتی از || استفاده می‌کنی یعنی «یا» پس کافیه که یکی از شرط‌ها درست
باشه و بقیه شرط‌ها دیده نمی‌شه.
در حالی که برای این کاری که می‌خوای باید از شرط && استفاده کنی.


var list = MyDataSource.Where( x=> condition1 || condition2 || condition3 )
.Where ( x=> x.date >= beginDate && x.date <= endDate )
.ToList();

وقتی Where ها رو جدا بنویسی مثل این می‌مونه که از شرط && استفاده کرده باشی.

صبا صبوحی

sonicuser
یک شنبه 26 بهمن 1393, 11:21 صبح
بازم ممنون ولی اینطوریم باید تمام فیلدها پر بشه
من میخوام حتی اگه چنتا از فیلدها پر شد بازم بیاد:لبخند:

SabaSabouhi
یک شنبه 26 بهمن 1393, 11:54 صبح
بازم ممنون ولی اینطوریم باید تمام فیلدها پر بشه
من میخوام حتی اگه چنتا از فیلدها پر شد بازم بیاد:لبخند:

سلام
خوب چرا از اول پرسش خودت رو شفاف نمی‌گی؟
من تو یه پست دیگه مفصل توضیح دادم. جستجو کنی پیداش می‌کنی.
اما خلاصه‌اش اینه که باید یک IQueriable درست کنی ( یعنی ToList آخرش اضافه نکنی )
بعد به ازای خالی نبودن هر شرط یه Where به IQueriable اضافه می‌کنی.
در آخر هم با یه ToList کار تمومه.

صبا صبوحی

wolf_majid
یک شنبه 26 بهمن 1393, 16:24 عصر
اگر تاریختون بصورت رشته باشه فکر نمیکنم بتونید اینطور عمل کنید (=> و =< برای رشته ها جواب نمیده (توی entity) )
به صورت زیر عمل کنید :
var v= db.tbldetails.Where(i => i.ferstande == txtferestande.Text || i.girande == txtgirande.Text || i.maghsad == txtmaghsad.Text || i.bar == txtbar.Text ).ToList();
var all=db.tbldetails.ToList();
all=all.where(شرط تاریخ).ToList();
datagrid.dataSource=v.Union(all);




البته Union رو تست کن ببین اگر تکراری ها رو حذف نکرد باید GetHashCodeو Equlas اون کلاست رو دوباره نویسی کنی

SabaSabouhi
یک شنبه 26 بهمن 1393, 16:52 عصر
اگر تاریختون بصورت رشته باشه فکر نمیکنم بتونید اینطور عمل کنید (=> و =< برای رشته ها جواب نمیده (توی entity) )
به صورت زیر عمل کنید :
var v= db.tbldetails.Where(i => i.ferstande == txtferestande.Text || i.girande == txtgirande.Text || i.maghsad == txtmaghsad.Text || i.bar == txtbar.Text ).ToList();
var all=db.tbldetails.ToList();
all=all.where(شرط تاریخ).ToList();
datagrid.dataSource=v.Union(all);




البته Union رو تست کن ببین اگر تکراری ها رو حذف نکرد باید GetHashCodeو Equlas اون کلاست رو دوباره نویسی کنی

سلام
دوست عزیز، چند نکته رو باید یادآوری کنم.
اول این که این روش اشتباه هست و تو داده‌ها با حجم بالا بدون شک دچار کندی شدید می‌شی.
هنگام استفاده از EF و Lambda حتماً باید توجه داشته باشی که فقط در آخرین مرحله باید از ToList استفاده کنی
وگرنه تمام داده‌ها بارگزاری شده و به حافظه‌ی کامپیوتر شما منتقل می‌شه و سپس فیلترینگ روی اون اجرا می‌شه
در حالی که شما باید تمام فیلترینگ رو بفرستی سمت Sql Server یعنی هر چی شرط داری رو به صورت IQueryable
اعمال کنی.
دوم این که دوستمون می‌خوان چند تا شرط اعمال کنن. تو این حالت union کار درستی نیست. چون شرط‌ها رو
به کل از بین می‌بره و مثل این می‌مونه که بین شرط‌ها بچای && از || استفاده کنی. اگر هم بخواهی این کار رو
انجام بدی باید بجای union از join استفاده کنی.
سوم این که شما با این روش دوبار رفتی سراغ دیتابیس و داده‌ها رو آوردی، در حالی که با تنها یک تماس با
دیتابیس باید تمام داده‌ها بارگزاری بشه.

و درباره دوستمون، اگر ایشون تاریخ رو به صورت رشته نگه‌داری کرده، بسیار کار اشتباهی هست و باید
حتماً تاریخ رو به صورت میلادی نگهداری کنه.

صبا صبوحی

wolf_majid
یک شنبه 26 بهمن 1393, 23:13 عصر
سلام
با حرف شما در مورد لیست موافقم اما گفتم اگر تاریخ به صورت رشتست (مثلا ذخیره تاریخ شمسی(حالا به هر دلیلی)) باید به صورت لیست درش بیارید که بتونید شرط بزرگتر کوچکتر رو روش اعمال کنید

دوم این که دوستمون می‌خوان چند تا شرط اعمال کنن. تو این حالت union کار درستی نیست. چون شرط‌ها رو
به کل از بین می‌بره و مثل این می‌مونه که بین شرط‌ها بچای && از || استفاده کنی
همینکار رو کردند دیگه.

اما در مورد union :
join کاربرد دیگه ای داره و معمولا" زمانی استفاده میشه که دو جدول که یکی کلید خارجی جدول دیگه رو داره به هم وصل بشن
اما اینجا میخواستم هر دوجدول که یکسانند در ادامه هم قرار بگیرند

در کل این روش , روش خیلی سنگینیه اما گفتم شاید در صورت نبود راه چاره دیگه به کارشون بیاد

sonicuser
دوشنبه 27 بهمن 1393, 17:33 عصر
سلام
خوب چرا از اول پرسش خودت رو شفاف نمی‌گی؟
من تو یه پست دیگه مفصل توضیح دادم. جستجو کنی پیداش می‌کنی.
اما خلاصه‌اش اینه که باید یک IQueriable درست کنی ( یعنی ToList آخرش اضافه نکنی )
بعد به ازای خالی نبودن هر شرط یه Where به IQueriable اضافه می‌کنی.
در آخر هم با یه ToList کار تمومه.

صبا صبوحی

ممنونم ولی گشتم پیدا نشد میشه لینک بدین؟؟

SabaSabouhi
دوشنبه 27 بهمن 1393, 19:17 عصر
سلام
راستش خودم هم یادم نیست عنوان تاپیکش چی بود. فکر کنم اگه دنبال IQueryable که من معمولاً
به اشتباه IQueriable می‌نویسم :خجالت: بگردی، پیداش کنی.

صبا صبوحی

پارسامهر
یک شنبه 27 دی 1394, 01:25 صبح
سلام
راستش خودم هم یادم نیست عنوان تاپیکش چی بود. فکر کنم اگه دنبال IQueryable که من معمولاً
به اشتباه IQueriable می‌نویسم :خجالت: بگردی، پیداش کنی.

صبا صبوحی



سلام.خداقوت

من هرچی دنبال IQueriable گشتم پیدا نکردم. منم مشکل همین دوستمونو دارم اگه ممکنه لینکشو بزارین. یا اینجا توضیح بدین.ممنون

Mahmoud.Afrad
یک شنبه 27 دی 1394, 16:46 عصر
نمونه کد لینک زیر رو ببینید.
جستجوی پیشرفته در Entity FrameWork (مقایسه جستجو در دیتابیس و فیلتر اطلاعات از قبل لود شده) (http://barnamenevis.org/showthread.php?471215-%D8%AC%D8%B3%D8%AA%D8%AC%D9%88%DB%8C-%D9%BE%DB%8C%D8%B4%D8%B1%D9%81%D8%AA%D9%87-%D8%AF%D8%B1-Entity-FrameWork-%28%D9%85%D9%82%D8%A7%DB%8C%D8%B3%D9%87-%D8%AC%D8%B3%D8%AA%D8%AC%D9%88-%D8%AF%D8%B1-%D8%AF%DB%8C%D8%AA%D8%A7%D8%A8%DB%8C%D8%B3-%D9%88-%D9%81%DB%8C%D9%84%D8%AA%D8%B1-%D8%A7%D8%B7%D9%84%D8%A7%D8%B9%D8%A7%D8%AA-%D8%A7%D8%B2-%D9%82%D8%A8%D9%84-%D9%84%D9%88%D8%AF-%D8%B4%D8%AF%D9%87%29)

پارسامهر
دوشنبه 28 دی 1394, 01:08 صبح
سلام مجدد. این قسمتو دیدم اما باز مشکل من حل شد درست متوجه نشدم. من میخوام به همین شکل کدها نوشته بشه

var list = MyDataSource.Where( x=> condition1 || condition2 || condition3 ) .Where ( x=> x.date >= beginDate && x.date <= endDate )
.ToList();

پارسامهر
دوشنبه 28 دی 1394, 13:15 عصر
سلام.
اینجوری کد نویسی کردم مشکلم حل شد ولی نمیدونم تا چه حد شیوه کدنویسیش درسته.امیدوارم به دردتون بخوره...


توضیح: دوتا تکس باکس داریم برای وارد کردن تاریخ که الزامی است و سه تکس باکس دیگه که شامل نام و نام خانوادگی و پسورد است و کار میتونه به دلخواه هرکدومو که خواست پر کنه و هرکدومو که خواست خالی بزاره. جست و جو بر اساس تکس باکس های پر شده انجام میشه...

protected void btnSearch_Click(object sender, EventArgs e) {
string A =txtName.Text;
string B = txtFamily.Text;
string C = txtPassword.Text;


DateTime D=Convert.ToDateTime(pcal1.Text);
DateTime E = Convert.ToDateTime(pcal2.Text);




Test te1 = new Test();
var list = context.Test
.Where( x =>
( x.TestDate >= D && x.TestDate <= E && A == "" && B == "" && C == "")
|| (x.TestDate >= D && x.TestDate <= E && x.TestName == A && x.TestFamily == B && x.TestPassword == C)


|| (x.TestDate >= D && x.TestDate <= E && x.TestName == A && B == "" && C == "")
|| (x.TestDate >= D && x.TestDate <= E && A == "" && x.TestFamily == B && C == "")
|| (x.TestDate >= D && x.TestDate <= E && A == "" && B == "" && x.TestPassword == C)


|| (x.TestDate >= D && x.TestDate <= E && x.TestName == A && x.TestFamily == B && C == "")
|| (x.TestDate >= D && x.TestDate <= E && x.TestName == A && B == "" && x.TestPassword == C)
|| (x.TestDate >= D && x.TestDate <= E && A == "" && x.TestFamily == B && x.TestPassword == C)


).ToList();


GridView2.DataSource= list ;

GridView2.DataBind();


}

Mahmoud.Afrad
دوشنبه 28 دی 1394, 15:45 عصر
اگر تعداد ستونهای جدول زیاد باشه چطور میخوای ترکیب همه رو بدست بیاری؟
کافیه به ازای هر فیلد که ممکنه خالی و یا پر باشه چک کنی و در صورت پر بودن در جستجو دخیل کنی

protected void btnSearch_Click(object sender, EventArgs e)
{
var list = context.Test.AsQueryable();
if (!string.IsNullOrWhiteSpace(pcal1.Text))
{
DateTime D = Convert.ToDateTime(pcal1.Text);
list = list.Where(x => x.TestDate >= D);
}
if (!string.IsNullOrWhiteSpace(pcal2.Text))
{
DateTime E = Convert.ToDateTime(pcal2.Text);
list = list.Where(x => x.TestDate <= E);
}
if (!string.IsNullOrWhiteSpace(txtName.Text))
{
list = list.Where(x => x.TestName == txtName.Text);
}
if (!string.IsNullOrWhiteSpace(txtFamily.Text))
{
list = list.Where(x => x.TestFamily == txtFamily.Text);
}
if (!string.IsNullOrWhiteSpace(txtPassword.Text))
{
list = list.Where(x => x.TestPassword == txtPassword.Text);
}
GridView2.DataSource = list.ToList();
GridView2.DataBind();
}