PDA

View Full Version : استفاده از حالت in در LINQ



kastakoorta
سه شنبه 05 اردیبهشت 1391, 12:37 عصر
با سلام خدمت دوستان عزیز .
من یه فرم جستجو دارم که دارم با LINQ مینیسمش .
تو یه قسمت میخوام یه فیلد را با حالت where fieldname in (select ...) بدست بیارم که معادل LINQ ش رو نمیدونم .
یه جدول دارم به نام PersonDevice که در اون با استفاده از کد سیستم مشخص کردم که این قطعه یا سیستم به شخص تحویل شده . حالا در این جستجو میخوام دو حالت تحویل شده یا نشده (موجود در انبار) رو مشخص کنم .
این هم کد من :



LS_DeviceAndSystemsDataContext db = new LS_DeviceAndSystemsDataContext();
var query = from sys in db.Tbl_Systemzs
join c in db.Tbl_Cities
on sys.FK_CTID equals c.CTID
join seller in db.Tbl_Sellers
on sys.FK_SID equals seller.SID
//--
//--
select new { sys.SYSID, sys.SYSAmvalCode, seller.SName, c.CTName, c.CTID, sys.SYSPrice, sys.SYSLoginDate, sys.FK_SSTID, sys.FK_DVLID };
//-- شروع پارامترهای جستجو
if (TextBox_Search_AmvalCode.Text.Trim() != "")
{
query = query.Where(r => r.SYSAmvalCode.Contains(TextBox_Search_AmvalCode.T ext.Trim()));
}
if (TextBox_Search_Seller.Text.Trim() != "")
{
query = query.Where(r => r.SName.Contains(TextBox_Search_Seller.Text.Trim() ));
}

if (DropDownList_City.SelectedValue.ToString() != "")
{
query = query.Where(r => r.CTID == Convert.ToInt32(DropDownList_City.SelectedItem.Val ue.ToString()));
}

if (DropDownList_LoginStatus.SelectedValue.ToString() != "")
{
query = query.Where(r => r.FK_DVLID == Convert.ToInt32(DropDownList_LoginStatus.SelectedI tem.Value.ToString()));
}

if (DropDownList_SystemStatus.SelectedValue.ToString( ) != "")
{
query = query.Where(r => r.FK_SSTID == Convert.ToInt32(DropDownList_SystemStatus.Selected Item.Value.ToString()));
}

if (TextBox_Search_DateStart.Text.Trim() != "" && TextBox_Search_DateEnd.Text.Trim() == "")
{
query = query.Where(r => r.SYSLoginDate == TextBox_Search_DateStart.Text.Trim());
}

if (TextBox_Search_DateStart.Text.Trim() != "" && TextBox_Search_DateEnd.Text.Trim() != "")
{
query = query.Where(r => r.SYSLoginDate.CompareTo(TextBox_Search_DateStart. Text.Trim()) >= 0 && r.SYSLoginDate.CompareTo(TextBox_Search_DateEnd.Te xt.Trim()) <= 0);
}

//-- شرایط نمایش
if (DropDownList_Status.SelectedValue.ToString() != "")
{
// سیستم های موجود در انبار
if (DropDownList_Status.SelectedValue.ToString() == "1")
{
var anbarquery = from anbarsys in db.Tbl_Systemzs
join t in db.Tbl_PersonDevices
on anbarsys.SYSID equals t.FK_SYSID
select new { anbarsys.SYSID };
//query = query.Where();
/*
()
*/
}

// سیستم های تحویلی به اشخاص
if (DropDownList_Status.SelectedValue.ToString() == "2")
{
}
}


if (query.Count() > 0)
{
GridView1.Visible = true;
GridView1.DataSource = query;
GridView1.DataBind();
}
else
{
GridView1.Visible = false;
}

d_derakhshani
سه شنبه 05 اردیبهشت 1391, 12:58 عصر
باید از دستور Contains استفاده کنید. مثال

int[] customerIds= new int[] { 1, 2, 3 };

var customers = from customer in context.CustomerSet
where customerIds.Contains(customer.Id)
select customer;


به جای customerIds که یک آرایه هست می تونی یک کوئری بزاری که customerId رو بر گرودنه. در نتیجه میشه select تو select

kastakoorta
سه شنبه 05 اردیبهشت 1391, 20:21 عصر
ممنون از راهنمایی تون . فقط Syntax ش رو در این حالت میشه بگید ؟



query = query.Where(r => r.SYSLoginDate == TextBox_Search_DateStart.Text.Trim());


منظور این که به یه کوری اضافه بشه .

و دوم اینکه من در حالت عادی تست کردم با مدل


LS_DeviceAndSystemsDataContext db = new LS_DeviceAndSystemsDataContext();
int[] customerIds = new int[] { 1, 2, 3 };
var query = from sys in db.Tbl_Systemzs
join c in db.Tbl_Cities
on sys.FK_CTID equals c.CTID
join seller in db.Tbl_Sellers
on sys.FK_SID equals seller.SID
where customerIds.Contains(sys.SYSID)
select new { sys.SYSID, sys.SYSAmvalCode, seller.SName, c.CTName, c.CTID, sys.SYSPrice, sys.SYSLoginDate, sys.FK_SSTID, sys.FK_DVLID };

جواب میده اما
وقتی خودم یه query جدید برای انکار مینویسم این کوری جواب نمیده .


var anbarquery2 = from anbarsys in db.Tbl_Systemzs
join t in db.Tbl_PersonDevices
on anbarsys.SYSID equals t.FK_SYSID
select new { anbarsys.SYSID };
var query = from sys in db.Tbl_Systemzs
join c in db.Tbl_Cities
on sys.FK_CTID equals c.CTID
join seller in db.Tbl_Sellers
on sys.FK_SID equals seller.SID
where anbarquery2.Contains(sys.SYSID)
select new { sys.SYSID, sys.SYSAmvalCode, seller.SName, c.CTName, c.CTID, sys.SYSPrice, sys.SYSLoginDate, sys.FK_SSTID, sys.FK_DVLID };

و از این خط خطا میگیره where anbarquery2.Contains(sys.SYSID)

d_derakhshani
سه شنبه 05 اردیبهشت 1391, 21:23 عصر
دوست عزیز در anbarquery2 نباید از new استفاده کنید و باید فقط بنویسید: select anbarsys.SYSID چزا؟(به مثال نگاه کنید آرایه ای از اعداده، اما new؟)

من موارد دیگه رو نگاه نکردم. شاید بعد رفع این مورد باز هم اشکالی باشه.

kastakoorta
سه شنبه 05 اردیبهشت 1391, 21:34 عصر
ممنون دوست عزیزم . کاملا درست گفتید . بی ربط نیست که معصوم فرمود علم اگر در ثریا هم باشد مردانی از سرزمین پارس به آن دست خواهند یافت .
نمونه کامل جستجو خودم رو میزارم شاید به درست دوستان هم بخوره .



LS_DeviceAndSystemsDataContext db = new LS_DeviceAndSystemsDataContext();
var query = from sys in db.Tbl_Systemzs
join c in db.Tbl_Cities
on sys.FK_CTID equals c.CTID
join seller in db.Tbl_Sellers
on sys.FK_SID equals seller.SID
select new { sys.SYSID, sys.SYSAmvalCode, seller.SName, c.CTName, c.CTID, sys.SYSPrice, sys.SYSLoginDate, sys.FK_SSTID, sys.FK_DVLID };
//-- شروع پارامترهای جستجو
if (TextBox_Search_AmvalCode.Text.Trim() != "")
{
query = query.Where(r => r.SYSAmvalCode.Contains(TextBox_Search_AmvalCode.T ext.Trim()));
}
if (TextBox_Search_Seller.Text.Trim() != "")
{
query = query.Where(r => r.SName.Contains(TextBox_Search_Seller.Text.Trim() ));
}

if (DropDownList_City.SelectedValue.ToString() != "")
{
query = query.Where(r => r.CTID == Convert.ToInt32(DropDownList_City.SelectedItem.Val ue.ToString()));
}

if (DropDownList_LoginStatus.SelectedValue.ToString() != "")
{
query = query.Where(r => r.FK_DVLID == Convert.ToInt32(DropDownList_LoginStatus.SelectedI tem.Value.ToString()));
}

if (DropDownList_SystemStatus.SelectedValue.ToString( ) != "")
{
query = query.Where(r => r.FK_SSTID == Convert.ToInt32(DropDownList_SystemStatus.Selected Item.Value.ToString()));
}

if (TextBox_Search_DateStart.Text.Trim() != "" && TextBox_Search_DateEnd.Text.Trim() == "")
{
query = query.Where(r => r.SYSLoginDate == TextBox_Search_DateStart.Text.Trim());
}

if (TextBox_Search_DateStart.Text.Trim() != "" && TextBox_Search_DateEnd.Text.Trim() != "")
{
query = query.Where(r => r.SYSLoginDate.CompareTo(TextBox_Search_DateStart. Text.Trim()) >= 0 && r.SYSLoginDate.CompareTo(TextBox_Search_DateEnd.Te xt.Trim()) <= 0);
}

//-- شرایط نمایش
if (DropDownList_Status.SelectedValue.ToString() != "0")
{
var myquery = from t in db.Tbl_PersonDevices
select t.FK_SYSID;
int[] customerIds = new int[] { 1, 2, 3 };
// سیستم های موجود در انبار
if (DropDownList_Status.SelectedValue.ToString() == "1")
{
query = query.Where(r => !myquery.Contains(r.SYSID));
}

// سیستم های تحویلی به اشخاص
if (DropDownList_Status.SelectedValue.ToString() == "2")
{
query = query.Where(r => myquery.Contains(r.SYSID));
}
}

if (query.Count() > 0)
{
GridView1.Visible = true;
GridView1.DataSource = query;
GridView1.DataBind();
}
else
{
GridView1.Visible = false;
}

A.S.Roma
چهارشنبه 06 اردیبهشت 1391, 11:49 صبح
به جای استفاده از extension method
count() بهتره از Any() استفاده کنید تا کدتون بهینه تر بشه . :)

kastakoorta
چهارشنبه 06 اردیبهشت 1391, 20:29 عصر
خیلی ممنون از رانمایی تون ، اگر مشکل یا پیشنهاد دیگه ای دارید ممنون میشم بگید .