PDA

View Full Version : مشکل جستجو در دیتابیس با انتیتی فریمورک



samiasoft
چهارشنبه 29 دی 1400, 21:49 عصر
سلام وقت بخیر
برای اینکه کلمه موردنظر را در دیتابیس جستجو کنم به کمک انتیتی فریمورک به این صورت دستور رو نوشتم :

var searchRecords = (from rows in database.tbl_sama
where rows.title.Contains(txt_search.Text)
select new
{
rows.id,
rows.codeNumber,
rows.title,
}).ToList();

dbGridView.DataSource = searchRecords;

اما متاسفانه در نتایج جستجو موارد نامرتبط هم دیده میشه ! که هدفم این بود فقط ردیف هایی که شامل کلمه "زلزله" باشه را بدست بیارم.

https://s20.picofile.com/file/8446632200/1.jpg
ایا این مشکل بخاطر استفاده از Contains هست ؟

برای حل مشکل بصورت موقت اومدم از کوئری اسکیوال استفاده کردم بدین شکل

var records2 = db.tbl_sama
.SqlQuery("select * from tbl_sama where title like '%" + txt_search.Text + "%' ")
.ToList();

dataGridView_standards.DataSource = records2;

و همانطور که مشاهده میکنید بدرستی نتایج نمایش داده میشه.


https://s20.picofile.com/file/8446632226/2.jpg
اما بدون استفاده از کوئری اسکیوال راه حل دیگری هم وجود داره ؟

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

روشی هم در این صفحه گفته شده که کلمات را با split جداکنیم و ... را هم تست کردم اما باز هم همان مشکل را دارد .
https://entityframework.net/knowledge-base/51368670/sql-word-wide---like---search-in-entity-framework-6-using-lambda-expression

Mahmoud.Afrad
سه شنبه 05 بهمن 1400, 13:28 عصر
من فکر میکنم رویدادی که این کد را درونش نوشته اید کار نمیکنه.

عکسها هم یکی هست تفاوت معلوم نیست.

samiasoft
چهارشنبه 06 بهمن 1400, 04:34 صبح
من فکر میکنم رویدادی که این کد را درونش نوشته اید کار نمیکنه.

عکسها هم یکی هست تفاوت معلوم نیست.

بسیار ممنونم از توجهتون ... حق با شماست تصویر دوم اصلاح شد.

دستور حتی داخل یک باتن قرار داده شده بود و به همین روال بالا مشکل پابرجا بود.

امروز بالاخره موفق شدم مشکل رو حل کنم جالبه وقتی به این شکل نوشتم بدرستی عملیات جستجو موارد مرتبط را نشون داد !!!
var searchRecords = (from rows in database.tbl_sama
select new
{
rows.id,
rows.codeNumber,
rows.title,
}).ToList();

dbGridView.DataSource = searchRecords.Where(c => c.title.Contains(txt_search.Text)).ToList();
اما ایا بنظرتون این اصولی هست ؟
ناگفته نماند فقط هم وقتی داخل شرط از contintes استفاده میکنم با چنین مشکلی روبرو میشوم وگرنه برای سایر شرط ها مثل equal همان دستورات قبلی بدرستی اجرا میشد !

Mahmoud.Afrad
پنج شنبه 07 بهمن 1400, 21:05 عصر
بسیار ممنونم از توجهتون ... حق با شماست تصویر دوم اصلاح شد.

دستور حتی داخل یک باتن قرار داده شده بود و به همین روال بالا مشکل پابرجا بود.

امروز بالاخره موفق شدم مشکل رو حل کنم جالبه وقتی به این شکل نوشتم بدرستی عملیات جستجو موارد مرتبط را نشون داد !!!
var searchRecords = (from rows in database.tbl_sama
select new
{
rows.id,
rows.codeNumber,
rows.title,
}).ToList();

dbGridView.DataSource = searchRecords.Where(c => c.title.Contains(txt_search.Text)).ToList();
اما ایا بنظرتون این اصولی هست ؟
ناگفته نماند فقط هم وقتی داخل شرط از contintes استفاده میکنم با چنین مشکلی روبرو میشوم وگرنه برای سایر شرط ها مثل equal همان دستورات قبلی بدرستی اجرا میشد !

این کوئری همه سطرها رو لود میکنه و بعد روی اون جستجو رو انجام میده.
در اینگونه موارد از پروفایلر یا هر راه دیگر ، ببینید چه کوئری روی دیتابیس اجرا میشه .

همون کوئری که خروجی اشتباه داشت رو اصلاح کنید و به جای contains از فانکشن like استفاده کنید
https://docs.microsoft.com/en-us/dotnet/api/system.data.entity.dbfunctions?view=entity-framework-6.2.0
https://docs.microsoft.com/en-us/dotnet/api/microsoft.entityframeworkcore.ef.functions?view=ef core-6.0

samiasoft
شنبه 09 بهمن 1400, 14:48 عصر
این کوئری همه سطرها رو لود میکنه و بعد روی اون جستجو رو انجام میده.
در اینگونه موارد از پروفایلر یا هر راه دیگر ، ببینید چه کوئری روی دیتابیس اجرا میشه .

همون کوئری که خروجی اشتباه داشت رو اصلاح کنید و به جای contains از فانکشن like استفاده کنید
https://docs.microsoft.com/en-us/dotnet/api/system.data.entity.dbfunctions?view=entity-framework-6.2.0
https://docs.microsoft.com/en-us/dotnet/api/microsoft.entityframeworkcore.ef.functions?view=ef core-6.0

بسیار ممنونم