PDA

View Full Version : سوال: جستجو در LINQ



ashkan1234
دوشنبه 30 اردیبهشت 1392, 10:26 صبح
سلام
اول امیدوارم مدیران یک بخشی رو مختص به LINQ در سی شارپ قرار بدن!
چطور میشه در لینک جستجویی را انجام داد بطوریکه:
سه تکست باکس داریم وممکنه فقط کاربر بر اساس یکی از تکست باکسها جستجو را انجام دهد؟
اومدم گفتم:
private void btnsearch_Click(object sender, EventArgs e)
{
using (var db=new linqconectionDataContext())
{

if (txt1.Text==string.Empty && txt2.Text==string.Empty && txt3.Text==string.Empty)
{
DataGrid1.DataSource = db.tbl_search;
return;
}

int @text1 =Convert.ToInt32(txt1.Text);
Int64 @text2 = Convert.ToInt64(txt2.Text);
string @text3 = txt3.Text;
var src=db.tbl_search.Where(c=> c.SRC_Id==@text1 || c.SRC_Name==@text2 || c.SRC_Pol==@text3);
if (src.Count() == 0)
MessageBox.Show("هیچ داده ای یافت نشد", "جستجو", MessageBoxButtons.OK, MessageBoxIcon.None);
else
DataGrid1.DataSource = src;


}
ولی مشکل اینجاست که وقتی یکی از تکست ها خالی باشن،به کانورتشون و متغیر مربوطه گیر میده!
میخواستم از TryParse استفاده کنم ولی دیدم خیلی طولانی میشه!
آیا راه کوتاه تری هست؟
-----------------------
تو این چند روز هر سوالی پرسیدم کسی جواب نداده!
امیدوارم به این یکی پاسخ داده بشه!

erfan_urchin
دوشنبه 30 اردیبهشت 1392, 10:33 صبح
اول امیدوارم مدیران یک بخشی رو مختص به LINQ در سی شارپ قرار بدن!
دوست عزیز این بخش وجود داره
دسترسی به داده ها (ADO.Net و LINQ و ...)
(http://barnamenevis.org/forumdisplay.php?144-%D8%AF%D8%B3%D8%AA%D8%B1%D8%B3%DB%8C-%D8%A8%D9%87-%D8%AF%D8%A7%D8%AF%D9%87-%D9%87%D8%A7-(ADO.Net-%D9%88-LINQ-%D9%88-...))

ashkan1234
دوشنبه 30 اردیبهشت 1392, 10:43 صبح
دوست عزیز این بخش وجود داره
دسترسی به داده ها (ADO.Net و LINQ و ...)
(http://barnamenevis.org/forumdisplay.php?144-%D8%AF%D8%B3%D8%AA%D8%B1%D8%B3%DB%8C-%D8%A8%D9%87-%D8%AF%D8%A7%D8%AF%D9%87-%D9%87%D8%A7-(ADO.Net-%D9%88-LINQ-%D9%88-...))

متاسفانه این بخش مختص سی شارپ نیست!و کل دات نت رو در بر میگیره!
فعلا سوال مطرح شده ام مهمتره!

Mahmoud.Afrad
دوشنبه 30 اردیبهشت 1392, 10:56 صبح
اولا خالی بودن را جداجدا چک کنید.
ثانیا: اگر دو تکست باکس همزمان پر بشه چی؟ در صورتی که چند ورودی پر بشه یعنی خروجی باید بر اساس and بین نتیجه هر قسمت شکل بگیره. در صورت خالی نبودن هر تکست باکس فیلتر را اعمال کنید.

var src = db.tbl_search.AsQueryable();

if (!string.IsNullOrWhiteSpace(txt1.Text))
{
int @text1 = Convert.ToInt32(txt1.Text.Trim());
src = src.Where(c => c.SRC_Id == @text1);
}

if (!string.IsNullOrWhiteSpace(txt2.Text))
{
Int64 @text2 = Convert.ToInt64(txt2.Text.Trim());
src = src.Where(c => c.SRC_Name == @text2);
}

if (!string.IsNullOrWhiteSpace(txt3.Text))
{
src = src.Where(c => c.SRC_Pol == txt3.Text);
}

if (src.Count() == 0)
{
dataGridView1.DataSource = null;
MessageBox.Show("هیچ داده ای یافت نشد", "جستجو", MessageBoxButtons.OK, MessageBoxIcon.None);
}
else
{
DataGrid1.DataSource = src;
}

ashkan1234
دوشنبه 30 اردیبهشت 1392, 11:11 صبح
تشکر!
حالا اگه بخوام جستجو رو به این صورت انجام بدم که دو مقدار عینا مثل هم نباشه چطوریه؟
مثلا اگر کاربر زد 7 هر چی آی دی که توش 7 هست رو بیاره!
یا زد الف همه اونایی که الف دارن رو بیاره
----------------
راستی من WhiteSpace ندارم!جاش Empty دارم ولی وقتی کاربر Space بزنه ارور میده!
چیکار کنم حالا؟

Mahmoud.Afrad
دوشنبه 30 اردیبهشت 1392, 12:02 عصر
از متدهای StartsWith و یا Contains میتونی استفاده کنی برای چک کردن شامل بودن. برای استفاده از این متدها نیازی به تبدیل مقادیر تکست باکس به عدد نیست بلکه باید مقدار فیلد جدول به رشته تبدیل بشه.
برای مثال میتونی اینطوری اصلاحش کنی

string idStr = txt1.Text.Trim();
string nameStr = txt2.Text.Trim();
string polStr = txt3.Text.Trim();

if (idStr != string.Empty)
{
src = src.Where(c => c.SRC_Id.ToString().Contains(idStr));
}

if (nameStr != string.Empty)
{
src = src.Where(c => c.SRC_Name.ToString().Contains(nameStr));
}

if (polStr != string.Empty)
{
src = src.Where(c => c.SRC_Pol.Contains(polStr));
}

tooraj_azizi_1035
دوشنبه 30 اردیبهشت 1392, 12:47 عصر
با همون TryParse کار کن:

int number;
bool result = Int32.TryParse(value, out number);
if (result)
{
Console.WriteLine("Converted '{0}' to {1}.", value, number);
}
else
{
if (value == null) value = "";
Console.WriteLine("Attempted conversion of '{0}' failed.", value);
}