Mahmoud.Afrad
دوشنبه 16 مرداد 1391, 13:25 عصر
با سلام
در این پست برنامه جستجوی پیشرفته توسط LINQ در Entity FrameWork را قرار میدم.
جدولی به نام Person با فیلدهای زیر را در نظر بگیرید
[ID] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](50) NULL,
[Lname] [nvarchar](50) NULL,
[Genre] NULL
دو تکست باکس به نامهای txtName , txtLastName برای نام و نام خانوادگی و یک چک باکس برای شرکت دادن و یا عدم شرکت دادن جنسیت در جستجو میباشد. دو رادیو باتن برای نوع جنسیت.
تمام اطلاعات مورد نیاز را توسط لیست قابل شمارشی از اشیاء Person به گریدویو اول بایند میکنیم:
IEnumerable<Person> allRecords;
private void Form1_Load(object sender, EventArgs e)
{
using (Database1Entities context = new Database1Entities())
{
allRecords = context.Person.ToList();
dgvAll.DataSource = allRecords;
if (dgvAll.Columns.Contains("Genre"))
dgvAll.Columns["Genre"].Visible = false;
}
}
(allRecords را در سطح کلاس تعریف کردیم تا برای فیلتر کردن بتوانیم از این لیست استفاده کنیم)
روش اول:
انجام جستجو روی دیتابیس:
برای جستجو کردن براساس انتخاب هایی که توسط کاربر انجام می شود که باید در جستجو شرکت داده شوند، با if انتخاب این پارامترها را بررسی می کنیم و در صورتی که توسط کاربر برای جستجو انتخاب و پر شده باشند شرط را روی کوئری اعمال میکنیم.
private void searchOnDataBase()
{
using (Database1Entities context = new Database1Entities())
{
// do search on database (execute query in database)
var persons = context.Person.AsQueryable();
if (txtName.Text.Trim() != string.Empty)
{
persons = persons.Where(p => p.Name.Contains(txtName.Text.Trim()));
}
if (txtLastName.Text.Trim() != string.Empty)
{
persons = persons.Where(p => p.Lname.Contains(txtLastName.Text.Trim()));
}
if (checkBox1.Checked && rdbMale.Checked)
{
persons = persons.Where(p => p.Genre == true);
}
else if (checkBox1.Checked && rdbFemale.Checked)
{
persons = persons.Where(p => p.Genre == false);
}
dgv_SearchOnDB.DataSource = persons;
}
}
کد بالا مستلزم اجرای کوئری در دیتابیس است و برای فیلتر کردن دیتابیس حجیم مناسب نیست. اما میتوان همان لیست قبلی را فیلتر کرد با کدی که در روش دوم می آید.
روش دوم:
فیلتر کردن لیست اطلاعات اولیه (بدون کوئری زدن روی دیتابیس انجام می شود چون اطلاعات یکبار لود شده اند)
(allRecords را به این دلیل در سطح کلاس تعریف کردیم تا در این متد قابل دسترس باشد):
private void filterList()
{
var persons = allRecords;
// do filtering (filter allrecords to result)
if (txtName.Text.Trim() != string.Empty)
{
persons = persons.Where(p => p.Name.Contains(txtName.Text.Trim()));
}
if (txtLastName.Text.Trim() != string.Empty)
{
persons = persons.Where(p => p.Lname.Contains(txtLastName.Text.Trim()));
}
if (checkBox1.Checked && rdbMale.Checked)
{
persons = persons.Where(p => p.Genre == true);
}
else if (checkBox1.Checked && rdbFemale.Checked)
{
persons = persons.Where(p => p.Genre == false);
}
// end filtering
dgv_FilteringRecords.DataSource = persons.ToList();
}
فیلتر کردن لیست اولیه در انجام عملیات جستجو سرعت به مراتب بیشتری دارد زیرا اطلاعات در رم قرار دارند و فیلتر روی این اطلاعات انجام می شود، در حالی که در روش اول اطلاعات توسط اسکیوال سرور از روی هارد خوانده می شوند. [B]پس اگر یکبار همه اطلاعات را لود کرده اید از روش دوم برای فیلتر کردن استفاده کنید وگرنه از روش اول.
Database1Entities مدل EF ساخته شده از دیتابیس است.
نمونه زیر پروژه ای از کدهای بالاست با مقایسه زمانی اجرای کدها.
در این پست برنامه جستجوی پیشرفته توسط LINQ در Entity FrameWork را قرار میدم.
جدولی به نام Person با فیلدهای زیر را در نظر بگیرید
[ID] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](50) NULL,
[Lname] [nvarchar](50) NULL,
[Genre] NULL
دو تکست باکس به نامهای txtName , txtLastName برای نام و نام خانوادگی و یک چک باکس برای شرکت دادن و یا عدم شرکت دادن جنسیت در جستجو میباشد. دو رادیو باتن برای نوع جنسیت.
تمام اطلاعات مورد نیاز را توسط لیست قابل شمارشی از اشیاء Person به گریدویو اول بایند میکنیم:
IEnumerable<Person> allRecords;
private void Form1_Load(object sender, EventArgs e)
{
using (Database1Entities context = new Database1Entities())
{
allRecords = context.Person.ToList();
dgvAll.DataSource = allRecords;
if (dgvAll.Columns.Contains("Genre"))
dgvAll.Columns["Genre"].Visible = false;
}
}
(allRecords را در سطح کلاس تعریف کردیم تا برای فیلتر کردن بتوانیم از این لیست استفاده کنیم)
روش اول:
انجام جستجو روی دیتابیس:
برای جستجو کردن براساس انتخاب هایی که توسط کاربر انجام می شود که باید در جستجو شرکت داده شوند، با if انتخاب این پارامترها را بررسی می کنیم و در صورتی که توسط کاربر برای جستجو انتخاب و پر شده باشند شرط را روی کوئری اعمال میکنیم.
private void searchOnDataBase()
{
using (Database1Entities context = new Database1Entities())
{
// do search on database (execute query in database)
var persons = context.Person.AsQueryable();
if (txtName.Text.Trim() != string.Empty)
{
persons = persons.Where(p => p.Name.Contains(txtName.Text.Trim()));
}
if (txtLastName.Text.Trim() != string.Empty)
{
persons = persons.Where(p => p.Lname.Contains(txtLastName.Text.Trim()));
}
if (checkBox1.Checked && rdbMale.Checked)
{
persons = persons.Where(p => p.Genre == true);
}
else if (checkBox1.Checked && rdbFemale.Checked)
{
persons = persons.Where(p => p.Genre == false);
}
dgv_SearchOnDB.DataSource = persons;
}
}
کد بالا مستلزم اجرای کوئری در دیتابیس است و برای فیلتر کردن دیتابیس حجیم مناسب نیست. اما میتوان همان لیست قبلی را فیلتر کرد با کدی که در روش دوم می آید.
روش دوم:
فیلتر کردن لیست اطلاعات اولیه (بدون کوئری زدن روی دیتابیس انجام می شود چون اطلاعات یکبار لود شده اند)
(allRecords را به این دلیل در سطح کلاس تعریف کردیم تا در این متد قابل دسترس باشد):
private void filterList()
{
var persons = allRecords;
// do filtering (filter allrecords to result)
if (txtName.Text.Trim() != string.Empty)
{
persons = persons.Where(p => p.Name.Contains(txtName.Text.Trim()));
}
if (txtLastName.Text.Trim() != string.Empty)
{
persons = persons.Where(p => p.Lname.Contains(txtLastName.Text.Trim()));
}
if (checkBox1.Checked && rdbMale.Checked)
{
persons = persons.Where(p => p.Genre == true);
}
else if (checkBox1.Checked && rdbFemale.Checked)
{
persons = persons.Where(p => p.Genre == false);
}
// end filtering
dgv_FilteringRecords.DataSource = persons.ToList();
}
فیلتر کردن لیست اولیه در انجام عملیات جستجو سرعت به مراتب بیشتری دارد زیرا اطلاعات در رم قرار دارند و فیلتر روی این اطلاعات انجام می شود، در حالی که در روش اول اطلاعات توسط اسکیوال سرور از روی هارد خوانده می شوند. [B]پس اگر یکبار همه اطلاعات را لود کرده اید از روش دوم برای فیلتر کردن استفاده کنید وگرنه از روش اول.
Database1Entities مدل EF ساخته شده از دیتابیس است.
نمونه زیر پروژه ای از کدهای بالاست با مقایسه زمانی اجرای کدها.