Telegram Group & Telegram Channel
C# Programming Guide
در راستای توضیح هسته: این دو تابع دوتا ورودی فانکشن رو با هم And و Or میکنن و تبدیل به یک func می کنن. نحوه ی استفاده از Expression ها برای And و Or کردن دو Func ورودی که جلوتر توضیح خواهم داد. #Expression #CSharp @CSharpTips
تابع OrAlso که در تصویر می بینید در اصل دو فانکشن میگیره و اونارو با هم Or میکنه و تبدیل به یک فانکشن به صورت Experssion میکنه به طوری که برای ORM هایی مثل EF Core قابلیت تبدیل به کوئری های دیتابیس رو داره.
حالا چطوری یاد بگیریم که با Experssion ها کار کنیم و باهاش چیزای جالبی خلق کنیم؟
چندتا قانون رو باید در نظر بگیرید:
1.اینکه Experssion ها دقیقا مثل کد نویسی شما نیستند بنابراین انتظار نداشته باشید بدون اینکه به Experssion بگید که این قسمت کدم باید اجرا بشه و نتیجه اش مقایسه بشه به صورت جادو وار خودش بفهمه.پس صدا زدن Expression.Invoke مهمه.
2.اگر Experssion رو کامپایل کنید بهتون خروجی delegate رو میده پس حواستون باشه که اگر کامپایلش کنید دیگه ORM نمیتونه تبدیلش کنه به کوئری دیتابیس.منظور از کامپایل کردن صدا زدن تابع Compile هست.
3.و اینکه Experssion ها توابع قابل تبدیل و ترجمه شدن در Runtime هستند که چون توی یک delegate به صورت خیلی ساده و مستقیم نوشته میشن خیلی هم ساده قابلیت تبدیل شدن و ترجمه دارن پس انتظار نداشته باشید یک تابع با body چند خطی که کلی توش ضرب و تقسیم کردید براتون تبدیل به experssion بشه که قابل ترجمه برای ORM ها باشه.

میخوام تابع زیر رو تبدیل به experssion در حالت runtime کنم:

        public static Func<T, bool> OrAlso2<T>(this Func<T, bool> left, Func<T, bool> right)
{
return x => left(x) || right(x);
}

توضیحات:

var param = Expression.Parameter(typeof(T), "x");

در خط کد بالا شما میبینید که من دارم یک پارامتر تعریف می کنم.

در کد زیر میبینید که من با استفاده از تابع OrElse دوتا فانکشن رو با هم Or کردم که همون عملگر || توی سی شارپ هست. وقتی نوشتم Expression.Invoke به این معنی هست که خروجی اون فانکشن باید با خروجی فانکشن دومی Or بشه.دوتا ورودی داریم که من ورودی اول رو همون فانکشن میذارم و بهش میگم که پارامترم رو به ورودی فانکشن بفرست.این به این معنی هست که من الان دارم یک فانکشنی میسازم که داخلش دوتا فانکشن رو با هم Or میکنم پس فانکشن اصلی من یک ورودی به نام x داره که x رو توی دوتا فانکشنی که دارم به عنوان ورودی بعدی پاس میدم تا ازش خروجی بگیرم.
var body = Expression.OrElse(Expression.Invoke(left, param), Expression.Invoke(right, param));

مثال بارز استفاده اش اینطوریه:

            Expression<Func<MyClass, bool>> firstQuery = x => x.Name == "Ali";
Expression<Func<MyClass, bool>> secondQuery = x => x.Age > 10;
Expression<Func<MyClass, bool>> mergedQuery = ExpressionHelper.OrAlso(firstQuery, secondQuery);

در کد های بالا ورودی اصلی x ما همون کلاس MyClass خواهد بود و ما وقتی توی خط اول Experssion هامون گفتیم Expression.Parameter(typeof(T), "x") یعنی همون ورودی x که از نوع MyClass هست رو تعریف کردیم.
حالا در کد های بعدی ما سه تا بلاک داریم:
1.Expression.Invoke(left, param)
2.Expression.Invoke(right, param)
3.Expression.OrElse

شماره یک و دو دارن ورودی x رو به عنوان پارامتر به فانکشن های ورودی میفرستن تا خروجی رو بگیرن یعنی یکبار x => x.Name == "Ali" و یکبار x => x.Age > 10 اجرا میشه و بعد توسط تابع Expression.OrElse با هم Or میشن.
حالا قدم بعدی اینه که وقتی پارامتر هارو ساختیم حالا باید از کاری که کردیم یک خروجی delegate از نوع experssion بسازیم که در خط آخر میبینید:

            var lambda = Expression.Lambda<Func<T, bool>>(body, param);

اینجا پارامتر اصلی experssion خودمون رو به عنوان ورودی از نوع param دادیم و منطق اصلی experssion مون که توسط OrElse ساختیم رو به عنوان body میدیم و انتظار داریم که خروجی ای که به ما میده یک experssion از نوع or کردن دو فانکشن experssion باشه که برای ORM ها قابل ترجمه باشه.
امیدوارم این آموزش براتون قابل استفاده بوده باشه.

کانال تلگرام:
@CSharpTips



tg-me.com/CsharpTips/330
Create:
Last Update:

تابع OrAlso که در تصویر می بینید در اصل دو فانکشن میگیره و اونارو با هم Or میکنه و تبدیل به یک فانکشن به صورت Experssion میکنه به طوری که برای ORM هایی مثل EF Core قابلیت تبدیل به کوئری های دیتابیس رو داره.
حالا چطوری یاد بگیریم که با Experssion ها کار کنیم و باهاش چیزای جالبی خلق کنیم؟
چندتا قانون رو باید در نظر بگیرید:
1.اینکه Experssion ها دقیقا مثل کد نویسی شما نیستند بنابراین انتظار نداشته باشید بدون اینکه به Experssion بگید که این قسمت کدم باید اجرا بشه و نتیجه اش مقایسه بشه به صورت جادو وار خودش بفهمه.پس صدا زدن Expression.Invoke مهمه.
2.اگر Experssion رو کامپایل کنید بهتون خروجی delegate رو میده پس حواستون باشه که اگر کامپایلش کنید دیگه ORM نمیتونه تبدیلش کنه به کوئری دیتابیس.منظور از کامپایل کردن صدا زدن تابع Compile هست.
3.و اینکه Experssion ها توابع قابل تبدیل و ترجمه شدن در Runtime هستند که چون توی یک delegate به صورت خیلی ساده و مستقیم نوشته میشن خیلی هم ساده قابلیت تبدیل شدن و ترجمه دارن پس انتظار نداشته باشید یک تابع با body چند خطی که کلی توش ضرب و تقسیم کردید براتون تبدیل به experssion بشه که قابل ترجمه برای ORM ها باشه.

میخوام تابع زیر رو تبدیل به experssion در حالت runtime کنم:

        public static Func<T, bool> OrAlso2<T>(this Func<T, bool> left, Func<T, bool> right)
{
return x => left(x) || right(x);
}

توضیحات:

var param = Expression.Parameter(typeof(T), "x");

در خط کد بالا شما میبینید که من دارم یک پارامتر تعریف می کنم.

در کد زیر میبینید که من با استفاده از تابع OrElse دوتا فانکشن رو با هم Or کردم که همون عملگر || توی سی شارپ هست. وقتی نوشتم Expression.Invoke به این معنی هست که خروجی اون فانکشن باید با خروجی فانکشن دومی Or بشه.دوتا ورودی داریم که من ورودی اول رو همون فانکشن میذارم و بهش میگم که پارامترم رو به ورودی فانکشن بفرست.این به این معنی هست که من الان دارم یک فانکشنی میسازم که داخلش دوتا فانکشن رو با هم Or میکنم پس فانکشن اصلی من یک ورودی به نام x داره که x رو توی دوتا فانکشنی که دارم به عنوان ورودی بعدی پاس میدم تا ازش خروجی بگیرم.
var body = Expression.OrElse(Expression.Invoke(left, param), Expression.Invoke(right, param));

مثال بارز استفاده اش اینطوریه:

            Expression<Func<MyClass, bool>> firstQuery = x => x.Name == "Ali";
Expression<Func<MyClass, bool>> secondQuery = x => x.Age > 10;
Expression<Func<MyClass, bool>> mergedQuery = ExpressionHelper.OrAlso(firstQuery, secondQuery);

در کد های بالا ورودی اصلی x ما همون کلاس MyClass خواهد بود و ما وقتی توی خط اول Experssion هامون گفتیم Expression.Parameter(typeof(T), "x") یعنی همون ورودی x که از نوع MyClass هست رو تعریف کردیم.
حالا در کد های بعدی ما سه تا بلاک داریم:
1.Expression.Invoke(left, param)
2.Expression.Invoke(right, param)
3.Expression.OrElse

شماره یک و دو دارن ورودی x رو به عنوان پارامتر به فانکشن های ورودی میفرستن تا خروجی رو بگیرن یعنی یکبار x => x.Name == "Ali" و یکبار x => x.Age > 10 اجرا میشه و بعد توسط تابع Expression.OrElse با هم Or میشن.
حالا قدم بعدی اینه که وقتی پارامتر هارو ساختیم حالا باید از کاری که کردیم یک خروجی delegate از نوع experssion بسازیم که در خط آخر میبینید:

            var lambda = Expression.Lambda<Func<T, bool>>(body, param);

اینجا پارامتر اصلی experssion خودمون رو به عنوان ورودی از نوع param دادیم و منطق اصلی experssion مون که توسط OrElse ساختیم رو به عنوان body میدیم و انتظار داریم که خروجی ای که به ما میده یک experssion از نوع or کردن دو فانکشن experssion باشه که برای ORM ها قابل ترجمه باشه.
امیدوارم این آموزش براتون قابل استفاده بوده باشه.

کانال تلگرام:
@CSharpTips

BY C# Programming Guide




Share with your friend now:
tg-me.com/CsharpTips/330

View MORE
Open in Telegram


telegram Telegram | DID YOU KNOW?

Date: |

China’s stock markets are some of the largest in the world, with total market capitalization reaching RMB 79 trillion (US$12.2 trillion) in 2020. China’s stock markets are seen as a crucial tool for driving economic growth, in particular for financing the country’s rapidly growing high-tech sectors.Although traditionally closed off to overseas investors, China’s financial markets have gradually been loosening restrictions over the past couple of decades. At the same time, reforms have sought to make it easier for Chinese companies to list on onshore stock exchanges, and new programs have been launched in attempts to lure some of China’s most coveted overseas-listed companies back to the country.

Pinterest (PINS) Stock Sinks As Market Gains

Pinterest (PINS) closed at $71.75 in the latest trading session, marking a -0.18% move from the prior day. This change lagged the S&P 500's daily gain of 0.1%. Meanwhile, the Dow gained 0.9%, and the Nasdaq, a tech-heavy index, lost 0.59%. Heading into today, shares of the digital pinboard and shopping tool company had lost 17.41% over the past month, lagging the Computer and Technology sector's loss of 5.38% and the S&P 500's gain of 0.71% in that time. Investors will be hoping for strength from PINS as it approaches its next earnings release. The company is expected to report EPS of $0.07, up 170% from the prior-year quarter. Our most recent consensus estimate is calling for quarterly revenue of $467.87 million, up 72.05% from the year-ago period.

telegram from es


Telegram C# Programming Guide
FROM USA