استفاده از توابع برروی فیلدها و انجام محاسبات در select هایی که در پرس وجوها در Lambda

سوال

سلام دوستان خسته نباشید.

من میخوام در کویری هایی که با لامبدا میزنم روی یک سری از فیلد ها محاسبات انجام بدم و بعدش به عنوان select نهایی به خروجی بفرستم.

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

یا یه مورد دیگه اینکه من میخوام براساس چند فیلد یه چیزی محاسبه کنم(مثلا سود) و اونو در نهایت توی select بیارم.(یعنی یه تابع رو صدا بزنم و چندتا از فیلدهارو بهش پاس بدم و اون به من یه خروجی عددی میفرسته که سود هست و من اونو در قالب یه فیلد به نام profit توی خروجی select بیارم)

 

مممنون از انجمن آکادمی درسمن

حل شده 0
Sahand 5 سال 1 پاسخ 424 دیده شده 0

پاسخ ( ۱ )

  1. سلام دوست عزیز

    دقت بفرمایید که زمانی که شما در حال استفاده از Select هستید درواقع هیچ دیتایی از منبع داده ای fetch نکردید.

    و شما در واقع در حال استفاده از IQueryable در محدوده Expression Tree هستید!

    حالا IQueryable چی هست؟

    اگه بخوایم وارد جزئیات نشیم و زیرساخت IQueryable رو بررسی کنیم میتونیم اینطوری بگیم که IQueryable یعنی ساختار خروجی ما بدون هیچگونه داده و بایند کردن داده ! به بیانی یعنی ما بدون اینکه به منبع داده ای درخواست بدیم و داده دریافت کنیم ابتدا ساختار اونو میسازیم مثلا میگیم خروجی ما یک {نام -فامیلی-سن} داره اما  هنوز نگفتیم داده رو بیار.

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

     

    در نتیجه باید مجموعه تبدیل IEunmrable بشه!

    حالا IEnumrable چیه؟

    این کالکشن همان IQueryable ماست به همراه داده(یعنی هم ساختار هم داده)

     

    حالا بریم سراغ سوال شما زمانی که میخواهید توی Select هاتون محاسبات انجام بدید مجموعه رو بهIenumrable تبدیل کنید. به قطعه کد زیر دقت کنید.

     

    در اینجا با استفاده  از AsEnumerable() مجموعه ما به مجموع قابل تغییر تبدیل میشه یا همون IEnumrable. و از دیتابیس داده جمع آوری میشه!

    و میتوانید دوباره select کنید و تابع رو در درون اون صدا بزنید .در این مثال من تاریخ شمسی رو برگشت میدم.

     

    شاد و موفق باشید.

     

    بهترین پاسخ

ارسال یک پاسخ