ورود

View Full Version : سوال: ذخیره حاصل کوئری linq در حافظه



ehsan123
دوشنبه 14 اسفند 1391, 22:38 عصر
سلام . من یه کوئری linq جهت جستجو در بانک تو برنامم دارم یه select ساده که در رویدادtextBox1_TextChanged نوشتم که درست کار می کنه اما اشکال این کد اینکه با وارد کردن هر کارکتر که کاربر تایپ میکنه هی وصل میشه به بانک تو مثلا 1000 رکورد دنبال رشته مورد نظر میگرده مثلا اگه کاربر تایپ کنه " تست" یه بار " ت " دوباره " تس " بعد هم "تست" رو دنبال میگرده که این کاملا غیر حرفه ای حالا کسی راه درستش و بلده، خیلی دونبال گشتم یه بارم دیگم پرسیدم اما جوابا نتیجه نداد
[/URL][URL]http://barnamenevis.org/showthread.php?383684 (http://http//barnamenevis.org/showthread.php?383684)

private void textBox1_TextChanged(object sender, EventArgs e)
{
EtkaDBEntities1 db = new EtkaDBEntities1();
var d = from row in db.Table
where row.Name.StartsWith(textBox1.Text)
select row;
dataGridView1.DataSource = d;
}

ehsan123
سه شنبه 15 اسفند 1391, 09:34 صبح
کسی نیست بلد باشه :ناراحت:

Mahmoud.Afrad
سه شنبه 15 اسفند 1391, 12:15 عصر
میتونید همه اطلاعات رو در حافظه لود کنید و عمل جستجو رو روی اون اعمال کنید.
مثال:

Database1Entities db;
IEnumerable<tbl> allRecords;
IEnumerable<tbl> result;

public FrmMain()
{
InitializeComponent();

db = new Database1Entities();
allRecords = db.tbl;
}

private void textBox1_TextChanged(object sender, EventArgs e)
{
result = from record in allRecords
where record.name.ToLower().Contains(textBox1.Text.ToLow er())
select record;

dataGridView1.DataSource = result.ToList();
}

نمونه هم در امضام هست.

ehsan123
یک شنبه 20 اسفند 1391, 16:02 عصر
میتونید همه اطلاعات رو در حافظه لود کنید و عمل جستجو رو روی اون اعمال کنید.
مثال:

Database1Entities db;
IEnumerable<tbl> allRecords;
IEnumerable<tbl> result;

public FrmMain()
{
InitializeComponent();

db = new Database1Entities();
allRecords = db.tbl;
}

private void textBox1_TextChanged(object sender, EventArgs e)
{
result = from record in allRecords
where record.name.ToLower().Contains(textBox1.Text.ToLow er())
select record;

dataGridView1.DataSource = result.ToList();
}

نمونه هم در امضام هست.
ممنون درست بود ، حالا اگه select رو چند تا جدول بود چی؟ اونوقت allRecords از چه نوعی بزاریم؟

Mahmoud.Afrad
یک شنبه 20 اسفند 1391, 22:32 عصر
باید یک کلاس با پراپرتی های متناسب تعریف کنید و موقع سلکت شئ ای از این کلاس ایجاد و مقداردهی کنید.
مثال:
فرض کنید میخواهیم نتیجه یک join را در allRecord بریزیم تا بعدا بتوانیم فیلتر کنیم.
آنچه که از join حاصل میشود یک شئ با دو پراپرتی میباشد. خب یک کلاس با دو پراپرتی مناسب تعریف میکنیم و در select شئ ای از این کلاس را new میکینم و پراپرتی های این شئ را با مقادیر مناسب پر میکنیم:

class clsRe
{
public string Name{get;set;}
public string RankName { get; set; }
}

Database1Entities db;
IEnumerable<clsRe> allRecords;
IEnumerable<clsRe> result;

public FrmMain()
{
InitializeComponent();

db = new Database1Entities();

allRecords = from p in db.Per
join r in db.Rank
on p.IDRANK equals r.id
select new clsRe { Name = p.name, RankName = r.RankName };
}

// Filter allRecord
private void button1_Click(object sender, EventArgs e)
{
result = from record in allRecords
where record.Name.ToLower().Contains(textBox1.Text.ToLow er())
select record;

dataGridView1.DataSource = result.ToList();
}


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

اگر مشکلی بود کد خودتونو قرار بدید.

behrozi.ir
یک شنبه 20 اسفند 1391, 22:58 عصر
میتونید همه اطلاعات رو در حافظه لود کنید و عمل جستجو رو روی اون اعمال کنید.

یعنی اگر 1 میلیون رکورد داشتیم باید لودش کنیم، خدا بخیر کنه
روش های خیلی بهتری هستش برای این کار

Mahmoud.Afrad
دوشنبه 21 اسفند 1391, 01:53 صبح
یعنی اگر 1 میلیون رکورد داشتیم باید لودش کنیم، خدا بخیر کنه
روش های خیلی بهتری هستش برای این کار

با توجه به موضوع تاپیک گفتم وگرنه جستجو در دیتابیس باید انجام بشه.

ehsan123
دوشنبه 21 اسفند 1391, 15:01 عصر
یعنی اگر 1 میلیون رکورد داشتیم باید لودش کنیم، خدا بخیر کنه
روش های خیلی بهتری هستش برای این کار

بنظر شما اگه جستجو تو رویداد textBox1_TextChanged باشه بهتر نیست یک بار از بانک خونده بشه و بعد از حافظه استفاده کنی؟

ehsan123
دوشنبه 21 اسفند 1391, 15:13 عصر
ممنون از پاسختون تست نکردم ولی میدونم جواب میده ، بنظر شما بهتر نیست رکورد بیاد تو حافظه از اونجا select یا فیلتر بشه مثل data table تو Ado ،هم سرعت میره بالا هم بار اضافی رو سرور نیست ،یه سوال دیگه میشه کوئری linq ریخت تو data table یا data set ?

Mahmoud.Afrad
دوشنبه 21 اسفند 1391, 17:18 عصر
اگر مشکل حافظه پیش نیاد خوبه یعنی تعداد رکوردها زیاد نباشه.