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: |

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.

Spiking bond yields driving sharp losses in tech stocks

A spike in interest rates since the start of the year has accelerated a rotation out of high-growth technology stocks and into value stocks poised to benefit from a reopening of the economy. The Nasdaq has fallen more than 10% over the past month as the Dow has soared to record highs, with a spike in the 10-year US Treasury yield acting as the main catalyst. It recently surged to a cycle high of more than 1.60% after starting the year below 1%. But according to Jim Paulsen, the Leuthold Group's chief investment strategist, rising interest rates do not represent a long-term threat to the stock market. Paulsen expects the 10-year yield to cross 2% by the end of the year. A spike in interest rates and its impact on the stock market depends on the economic backdrop, according to Paulsen. Rising interest rates amid a strengthening economy "may prove no challenge at all for stocks," Paulsen said.

telegram from in


Telegram C# Programming Guide
FROM USA