دسته بندی ها
19:49 1399/04/14

دریافت مقدار ثابت در کویری Linq

مشخصات سوال کننده :
کاربر : hamdola     امتیاز کاربر : 121     رتبه کاربر : 12
دسته بندی : سی شارپ Asp.net Core

به این سوال امتیاز بدهید    0
تعداد بازدید این سوال : 2565
هوش مصنوعی

پاسخ هوش مصنوعی

خطای دریافتی شما به این خاطر است که از متد Single() استفاده کرده اید که فقط در صورتی کار می کند که دقیقاً یک عنصر در نتیجه وجود داشته باشد. اگر کویری شما چندین عنصر برگرداند، این خطا رخ می دهد.

برای برخورد با این مشکل، می توانید از متد SingleOrDefault() به جای Single() استفاده کنید. این متد در صورت وجود چندین عنصر، مقدار پیش فرض (به عنوان مثال 0 برای int) را برمی گرداند.

کد اصلاح شده شما به شکل زیر خواهد بود:

var age = (from u in _context.product 
            where u.supplierid == supplierid 
            select u.number).SingleOrDefault();

با این تغییر، اگر هیچ نتیجه یا نتایج چندگانه ای وجود داشته باشد، خطای شما رفع خواهد شد و مقدار age به درستی تنظیم می شود.

همچنین، اگر می خواهید فقط اولین نتیجه را بگیرید، می توانید از FirstOrDefault() نیز استفاده کنید که مشابه عملکرد SingleOrDefault() است، اما اگر چندین نتیجه وجود داشته باشد، تنها اولین نتیجه را برمی گرداند:

var age = (from u in _context.product 
            where u.supplierid == supplierid 
            select u.number).FirstOrDefault();

این روش نیز می تواند به شما در جلوگیری از بروز خطا کمک کند.

به این پاسخ امتیاز بدهید    0
امتیاز: - رتبه: -
پاسخ دهنده : Sowgandi 19:58 1399/04/14

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

var age = (from u in _context.users where u.userid == userid select new {u.age}).Single();

 

به این پاسخ امتیاز بدهید    0
امتیاز: 876 رتبه: 3
پاسخ دهنده : Sowgandi 20:21 1399/04/14

خب دوست عزیز مقدار فیلتر شده شما در کوئری بیش از یک مورد هست در صورتی که شما در اخر کوئری از Single استفاده کردید!

 مقدار userid رو چک کنید ببینید درست هست یا خیر؟ در صورتی که درست باشه، کاربری با این آی دی بیش یک مورد در دیتابیس وجود داره!

ویرایش شده در شنبه 14 تیر 1399 ساعت 20:23:26
به این پاسخ امتیاز بدهید    0
امتیاز: 876 رتبه: 3
پاسخ دهنده : Sowgandi 20:39 1399/04/14
var age = (from u in _context.product where u.supplierid == supplierid select u.number).Max();

کد بالا بزرگترین عدد ثبت شده رو بر میگردونه. و اگر به جای Max کلمه Last رو قرار بدید آخرین عدد رو برمیگردونه

تست بفرمایید و اگر مشکل برطرف نشد اعلام بفرمایید.

ویرایش شده در شنبه 14 تیر 1399 ساعت 20:43:00
به این پاسخ امتیاز بدهید    0
امتیاز: 876 رتبه: 3
پاسخ دهنده : saedbfd 20:49 1399/04/14

سلام

نکته اول دقت کنید که شما یک متغیر از نوع var تعریف کردید و پاسخ کوئری رو داخل این متغیر قرار دادید. بنابراین انتظار نداشته باشید بتونید مثل یک List باهاش برخورد کنید.

کوئری شما میتونه به کوئری زیر تغییر کنه

 

   var age = (from u in _context.product where u.supplierid == supplierid select u)
                         .ToList().OrderByDescending(o => o.supplierid).Take(1).Select(s => new { supid = s.supplierid });

   int lastnum = age.First().supid;

 

در کوئری بالا چند نکته وجود داره

 

  1. اول اینکه ممکنه خروجی شما چندین عدد داشته باشه و شما توی توضیحات پاسخهاتون گفتید آخرین عدد رو لازم دارید. بنابراین با استفاده از دستور orderbydescending خروجی رو از آخر به اول مرتب می کنیم.
  2. در ادام از دستور Take(1) استفاده کردیم. یعنی آخرین سطر رو که آخرین عدد هم در این سطر هست رو گرفتیم.
  3. و در نهایت با استفاده از دستور Select فقط ستون مورد نظر که supplierid هست رو انتخاب کردیم و یک اسم به نام supid بهش دادیم.

خب تا اینجا مقدار آخرین عدد رو داریم اما اگر الان نمیتونید مثل یک متغیر int از این عدد استفاده کنید بنابراین در ادامه در متغیر lastnum آخرین اولین عدد موجود در متغیر var رو دریافت کردیم.

 

در حال حاضر متغیر lastnum یک متغیر معمولی int با مقدار آخرین عدد شما هست

 

موفق باشید

ویرایش شده در شنبه 14 تیر 1399 ساعت 20:57:07
به این پاسخ امتیاز بدهید    2
امتیاز: 1664 رتبه: 1
برای ارسال پاسخ لطفا وارد حساب کاربری خود شوید.   ورود