PDA

View Full Version : ارسال علامت دستور Where در متد و استفاده از آن در Query



hamid.shekasteh
پنج شنبه 07 مرداد 1389, 18:55 عصر
با سلام به کاربران
می خواستم آیا امکان اینکه علامت بین دو مقدار درون دستور LINQ (== ، >= و<=و...)را به صورت پارامتر به متدی که دستور linq در اون اجرا میشه فرستاد و از اون در Query استفاده کرد؟

hamid.shekasteh
جمعه 08 مرداد 1389, 07:47 صبح
در واقع من از معماری Muti tier استفاده می کنم و در لایه Presentation با توجه به تنظیماتی که کاربر در فرم انجام داده یک سری پارامتر ها را درون یک متد به لایه ی دیگر صدا می زنم.در حالت عادی و با دسورات اس کیو ال این کار را با فرستادن مثلا "=" یا "like" انجام می دهیم که این علامت ها در یک string قرار گرفته و سپس اجرا می شدند ولی در linq ؟
دوستان کسی راه حلی نداره؟

moharrami
جمعه 08 مرداد 1389, 09:08 صبح
به نظر بنده خوبه که از دستور switch استفاده کنید. یعنی علامت رو به صورت enum یا string به متد بفرستید و در اونجا با دستور switch تشخیص بدید و کوئری تون رو بسازید. البته میدونم که منظورتون ساختن یک دستور با رشته ها و اجرای اونه. برا این کار هم می تونید در مورد System.Linq.Expressions (http://msdn.microsoft.com/en-us/library/system.linq.expressions.aspx) مطالعه کنید که البته سخت تر و پر هزینه تر خواهد بود. برای شروع به اینجا (http://community.bartdesmet.net/blogs/bart/archive/2008/08/26/to-bind-or-not-to-bind-dynamic-expression-trees-part-0.aspx)مراجعه کنید.

ricky22
جمعه 08 مرداد 1389, 10:01 صبح
درباره درست یا غلط بودن لایه ای بودن برنامت صحبت نمی کنم ....
--------------------------------
اما برای این کاری که می خوای انجان بدی پیشنهاد من ساخت Overload از توابع هست به جای این که بخوای همه ی کار ها رو در یک تابع با کلی شرط انجام بدی خوانایی برنامت رو بالا می بره. یا اینکه از چند تابع مختلف استفاده کنی.
فرستادن به صورت String عملگر کار درستی نیست.
برای اطلاعات بیشتر این کار رو انجام بده ! :

Dim q = from p in io.directory.getdirectories("c:\") where p.lenght > 2 select p
msgbox q.tostring

بعد رشته رو به صورت string بفرست ببین چه تغییری می کنه query تولید شده.

دستورات رو دستی نوشتم و در Editor VS ننوشتم احتمالا مشکل دارن خودت تصحیحش کن.
موفق باشی ;)

hamid.shekasteh
شنبه 09 مرداد 1389, 08:27 صبح
به نظر بنده خوبه که از دستور switch استفاده کنید. یعنی علامت رو به صورت enum یا string به متد بفرستید و در اونجا با دستور switch تشخیص بدید و کوئری تون رو بسازید.

این کار هم احتمالا جواب میده ولی استاندارد نیست فکر می کنم باید برم به سراغ همونSystem.Linq.Expressions (http://msdn.microsoft.com/en-us/library/system.linq.expressions.aspx)


درباره درست یا غلط بودن لایه ای بودن برنامت صحبت نمی کنم ....

اگه مشکلی داره حتما بگو چون می خوام تا جایی که میشه اصولی کار کنم خودت تا حالا به این مشکل خوردی؟



اما برای این کاری که می خوای انجان بدی پیشنهاد من ساخت Overload از توابع هست

تصور کن برای هر جدول و برای هر فیلد چند تا overload
زیاد میشه در اقع ما از linq استفاده می کنیم تا کد کمتر و خونا تری بنویسیم،نه؟

یه نمونه کد داری برای LinqTosql + n tier غیر از اینها

LINQ to SQL N-Tier with ASP.NET (http://msdn.microsoft.com/en-us/library/bb882682.aspx)
https://code.msdn.microsoft.com/Thread/View.aspx?ProjectName=multitierlinqtosql
کلا به غیر از مثال هایی که در MSDN , CodePlex هست.چون اونها رو خوندم.

ricky22
شنبه 09 مرداد 1389, 09:10 صبح
این (http://www.simple-talk.com/dotnet/.net-framework/designing-a-data-access-layer-in-linq-to-sql/)لینک رو مطالعه کن.


تصور کن برای هر جدول و برای هر فیلد چند تا overload
زیاد میشه در اقع ما از linq استفاده می کنیم تا کد کمتر و خونا تری بنویسیم،نه؟به نظر من چند تا حالتی رو که می خوای General بنویس بعد مثلا Entity و ColumnName رو پاس بده بهش و مثلا یه لیست رو بگیر.
با توجه به چند تا ویدیویی که دیدم برای در اوردن لایه دیتا از LINQ به تنهایی استفاده نکن و از LINQ + Entity Framework استفاده کن.
:) موفق ++ ;

hamid.shekasteh
دوشنبه 11 مرداد 1389, 08:21 صبح
توی لینک بالا که ricky22 (http://www.barnamenevis.org/forum/member.php) گذاشتند مطالب مفیدی به همراه نمونه بود که خوبه کسانی که صفحه رو می خوانند نگاهی بهش بیندازند.در مورد کلیت کار در Data Access Layer in LINQ to SQL

حل شد گفتم بگم شاید برای دوستان مفید باشه.
اما مشکل چه جور حل شد. وقتی قبلا با LINQ کار می کردم در بعضی از Overload های توابع یه Syntax خاص دیده بودم که برام آشنا نبود،مثلا وقتی متد All رو صدا می زدم و پرانتز باز رو می گذاشتم یه همچین چیزی رو VS نمایش می داد:




Func<TSource, bool> predicate


یه کم بیشتر که گشتم فهمیدم که با اون مشکل حل میشه و کد نویسی هم واقعا کم تر و اصولی تره.

کد زیر رو در نظر بگیرید که درDAL نوشته میشه :



public IEnumerable<Player> Select(Func<Player,bool> keySelection)
{
return data.Players.Where(keySelection);

}


با نوشته این کد شما شرط یا شرط هاتون رو به متد می فرستین(این کار معمولا در رابط کاربری انجام می شود) و این شرط ها در هنگام اجرا سر جای keySelection می نشینند.

نکته جالب اینجاست که فرقی نمیکند که یه شرط یا چند شرط را می فرستید و یا بین آنها چه علامتی قرار دارد(==،>،<)

به نوشتن متد در لایه Presentation دقت کنید.
P یه متغیر ایجاد شده از کلاسی هست که کد بالا در اون قرار گرفته است:



IEnumerable<Player> findedPlayer0 = p.Select(
exp => exp.PlayerId > 10);

//Or

IEnumerable< Player> findedPlayer1 = p.Select(
exp => exp.PlayerId > 0
&&
exp.Name.Contains("Projeha"));

//Or

IEnumerable< Player> findedPlayer2 = p.Select(
exp => exp.PlayerId <20
||
exp.Name.EndsWith("Projeha"));




احتمالا این کد ها به درد شما هم می خوره.

لینک زیر هم بهتون کمک می کنه:

http://www.hanselman.com/blog/TheWeeklySourceCode52YouKeepUsingThatLINQIDunnaThi nkItMeansWhatYouThinkItMeans.aspx

hamid.shekasteh
یک شنبه 17 مرداد 1389, 08:14 صبح
سلام
من یه مدت نبودم فکر می کنم بهتره بحث n-tier رو یه جای بهتر ادامه بدیم به دو دلیل :
1:این تاپیک مربوط به یه مطلب دیگه بود که جوابش رو پیدا کردم.
2 : تعداد بازدید کنندگان این تالار کمه.
ممنون از توجه