PDA

View Full Version : سوال: اشکال در استفاده از متد LAST در یک کوئری Linq



montazer313
دوشنبه 22 دی 1393, 19:49 عصر
با سلام خدمت دوستان گرامی
من در ASP.net از Entity framework استفاده می کنم البته اولین بار هست که از این روش استفاده می کنم و تازه وارد هستم. دستورات مشابه LinQ است .
من فرمی دارم که می خواهم هر بار که باز میشه شماره ای به فرم اختصاص داده بشه و لذا سعی کردم با استفاده ز کوئری زیر از جدول مربوطه شماره (ID) آخرین رکورد را بدست بیارم و با اضافه کردم یک واحد به اون شماره فرم بعدی را بدست بیارم و در فرم و جدول پایگاه داده ثبت کنم.



var pi = (from p in db.ParkingInters
select p).Last() ;


اما درا ین صورت error زیر را میده ولی اگر به جای Last از تابع First استفاده کنم اجرا میشه و مشکلی نداره جز این که هدف من را لرآورده نمی کنه ! خواهشا بفرمایید ایراد از کجاست و چطوری باید حل کرد این مشکل را ؟


LINQ to Entities does not recognize the method 'SghatKhodroModel.ParkingInter Last[ParkingInter](System.Linq.IQueryable`1[SghatKhodroModel.ParkingInter])' method, and this method cannot be translated into a store expression.

montazer313
سه شنبه 23 دی 1393, 08:36 صبح
سلام دوستان
پس چرا کسی پاسخ نداده؟ من سریعا نیاز دارم پروژه را باید تحویل بدهم.
خیلی ممنون میشم سریع کمک کنید.

SabaSabouhi
سه شنبه 23 دی 1393, 08:48 صبح
سلام
دستورهای Linq یکسان هستن، اما باید یه سری ریزه‌کاری ها رو در نظر داشته باشین.
مثلاً وقتی از دیتابیس می‌خونید، Last کار نمی‌کنه. بجای اون باید لیست رو برعکس Sort کنید و
با First بخونید. دلیلش هم اینه که First به Top ترجمه می‌شه ولی هیچ ترجمه‌ای از Last به Sql نمی‌شه انجام داد.



var lastItem = MyList.OrderByDescending( x=>x.Id ).FirstOrDefault();



و یا این که اگه لیستتون خالی باشه، مقادیر Max و Min خطا می‌ده. باید حتماً قبل از
Min و Max از خالی نبودن لیست مطمئن بشین.

صبا صبوحی

montazer313
سه شنبه 23 دی 1393, 09:53 صبح
سلام
خیلی ممنون از راهنمایی و پاسخ خانم صبوحی، اما راستش من در این زمینه مبتدی هستم و دقیقا متوجه نشدم این دستو را باید کی نوشت؟ اول باید یک Select روی دیتابیس انجام بدیم و بعد برای خروجیش این Sort کردن را انجام بدیم؟ اون X چیه و بجاش چی باید بگذارم؟
خیلی ممنون میشم پاسخ بدین.

SabaSabouhi
سه شنبه 23 دی 1393, 11:51 صبح
سلام
اون عبارت x=>x.Id یه تابع بدون نام هست ( AnonymousMethod ) مثل این که یه تابعی باشه که مقدار x رو بگیره و x.id رو برگردونه
در اینجا x از جنس اقلام لیست شما هست. و به صورت خلاصه معنی این عبارت اینه که هنگام مرتب کردن
بر اساس فیلد Id عمل کنه.

نکته 1: شما باید برای کار کردن با EF حتماً Linq رو یاد بگیرید و خیلی خوبه که Lambda رو هم یاد بگیرید.
گمان می‌کنم که اگه جستجو کنید تو همین سایت، مطلب کم نباشه.
نکته2: من آقای صبوحی هستم :)

صبا صبوحی

montazer313
سه شنبه 23 دی 1393, 12:51 عصر
سلام آقای صبوحی
عذر می خوام اشتباه شد.
خیلی ممنون از راهنمایی تون
من خیلی واضح می خوام بفرمایید چکار کنم؟
اول باید این query را بنویسم


var pi = from p in db.ParkingInters
select p;


بعدش اون Sort که شما فرمودین به چه شکلی بنویسم؟ یعنی بجای x چی باید بگذارم با توجه به این query ؟
با تشکر و سپاس فراوان

SabaSabouhi
سه شنبه 23 دی 1393, 15:11 عصر
سلام
دوست عزیز، کدی که من نوشتم Lambda بود، شما لازم نیست اونطوری بنویسید، با همین LinQ که شما نوشتین هم می‌شه.
کافیه بر اساس یکی از فیلد‌ها مثل تاریخ، نام یا Id خروجی رو Sort کنید. و سپس اولین عنصر رو بخونید.
من چون Lambda رو خواناتر می‌دونم، همیشه اونطوری کد رو می‌نویسم.
در ضمن شما جای x قرار نیست چیزی بگذارید. خود x یا هر عبارتی که بجاش بگذاری معادل ورودی یک متد هست و جنسش هم


از جنس جدول شما هست. اگه فرض کنیم این جدول یک فیلد ( ستون ) به نام Date داره می‌شه نوشت:


var pi = db.ParkingInters.OrderByDescending ( x=>x.Date ).FirstOrDefault();


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


var pi = db.ParkingInters
.OrderByDescending( x => x.Date )
.FirstOrDefault();

تمام Joinها و شرط‌ها و غیره رو می‌تونید اینطوری پشت سر هم بیارید. بخصوص وقتی که Joinها و شرطهای زیادی داریم.
این روش خیلی خواناتر هست. ( فرض کن 6 ماه بعد بخوای Source رو بخونی! یا این که یه نفر دیگه بخواد Source رو بخونه )

صبا صبوحی

montazer313
چهارشنبه 24 دی 1393, 08:17 صبح
سلام آقای صبوحی
خیلی ممنون از لطف و پاسخ مفید و کاملتون.
مشکل حل شد.
یک منبع و روش خوب برای یادگیری سریع Linq و EF میشه معرفی کنید.
با تشکر فراوان