PDA

View Full Version : سوال: Ignore کردن پارامتر ها در دستور Select



morika
شنبه 08 آذر 1393, 22:22 عصر
سلام
database.files.Where(z => z.price.MainPrice >= minPrice && z.price.MainPrice <= maxPrice);
توی دستور بالا گاهی ممکنه همه پارامترها وارد نشه. مثلا minPrice یا maxPrice هردو وارد شن. یا یکیشون مقدار null داشته باشه یا هردوشون null باشن.
با چه دستوری میشه بهش فهموند فقط پارامترهایی که null نیستن رو توی گزینش دخیل کن؟ یعنی مثلا یه IF وجود داشته باشه که اول بررسی کنه ببینه minPrice خالی هست یا نه بعد دستور z.price.MainPrice >= minPrice رو شرکت بده؟
ممنون

RIG000
شنبه 08 آذر 1393, 22:33 عصر
maxPrice , minPrice رو شما دارید از ورودی می گیرید یه if بذارید که که حداقل یکی از اینها null بود کل عبارت مورد بررسی قرار نگیرد. البته امیدوارم متوجه سوالتون شده باشم....

RmeXXXXXXXXX
شنبه 08 آذر 1393, 22:36 عصر
تا جایی ک من میدونم توی دستور اسکیوال ایف نداریم!!!
ولی توی storeprocedure ها میتونی استفاده کنی! بیا و یه دونه از همین ک گفتم تعریف کن و ایف هم توش استفاده کن!

یا
یا فیلدها و کلاً قسمت where رو توی برنامه ات محاسبه کن! البته اگه از معماری چندلایه استفاده می کنی یکم بیشتر دقت کن ک یوقت بهم نریزی نظم رو!!!

morika
شنبه 08 آذر 1393, 22:38 عصر
درسته از ورودی دریافت میشه اما اگه بخواینم با IF چک کنیم ببینیم null هست یا نه باید کل عبارت رو چندبار برای حالتهای مختلف در if ها و else if ها بنویسیم
درسته؟

RIG000
شنبه 08 آذر 1393, 23:05 عصر
اول اینکه من فکر کردم این ef رو linq پیاده کردی....و method ....
گفتم تو کنترلرت یا جایی هست که دسترسی به ورودی هات داری و بتونی شرط بزنی . من خودم به هیچ وجه از stoerd ها استفاده نمی کنم. چون وقتی اینور میتونم کارمو انجام بدم دیگه چرایه بار غذارو پشت رو کنم بخورم...
من حالا میبینم برات که چطور تو sql ... باس if زد. دیدم بهت میگم. اما وقتی شما اومدی && گذاشتی یعنی هر دو باس پر باشه. پس یه if میزنی که جفت این ها خالی بود این عبارت پایین رو اجرا نکن.

RIG000
شنبه 08 آذر 1393, 23:08 عصر
حالا این رو ببین. ببین میتونی کارت رو را بندازی.
http://msdn.microsoft.com/en-us/library/ms182587.aspx

morika
شنبه 08 آذر 1393, 23:28 عصر
خب من مشکلم رو یه جوری حل کردم. البته این راه حل واسه مشکل من جواب میده ولی فکر نکنم خیلی اصولی باشه
فبل از select کردن بهش گفتم اگه minPrice خالی بود با عدد 0 پرش کن و اگه maxPrice خالی بود با عدد 999999999
وقتی تو این بازه select کنه مثل این می مونه که اصلا چیزی وارد نشده

RIG000
شنبه 08 آذر 1393, 23:53 عصر
شما در صورت null بودن نمیخای دستورت اجرا شه. ولی داری کاری میکنی که اجرا بشه. این درست نمیتونه باشه. شما میخای در صورت null بودن از این دستور گذر کنی. باید عبارت شرطی بهش بدی نه اینکه به نوعی پرش کنی تا بخای اجراش کنی و بخای دورش بزنی. عین این میمونه که هر بار بخای راه کنار اتش رو نری و از روش ببپری چون گامت بلنده!
حالا بهتر نبود شرط میکردی که اگه minprice =null بود اصلا این دستور رو نادیده بگیر ؟ دیگه نیازی هم به && هم نداشت با ورودی maxprice...

helpsos
یک شنبه 09 آذر 1393, 00:57 صبح
شما باید اول اطلاعاتت رو بریزی توی یه متغیر از نوع IQueryable

var query=db.files.asqueryable();

بعد بیای و دونه دونه شرط ها رو روش اعمال کنی

if (!string.IsNullOrEmpty(minprice))
{
query= query.Where(z => z.price.MainPrice >= minPrice);
}

تا اینجا به بانک مراجعه نشده
حالا اون آخر کار که شرط هاتون تمام شد از مثلا دستور TOList استفاده کن تا اطلاعاتت رو بهت نشون بده
return query.tolist();