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

Importantly, that investor viewpoint is not new. It cycles in when conditions are right (and vice versa). It also brings the ineffective warnings of an overpriced market with it.Looking toward a good 2022 stock market, there is no apparent reason to expect these issues to change.

What is Telegram Possible Future Strategies?

Cryptoassets enthusiasts use this application for their trade activities, and they may make donations for this cause.If somehow Telegram do run out of money to sustain themselves they will probably introduce some features that will not hinder the rudimentary principle of Telegram but provide users with enhanced and enriched experience. This could be similar to features where characters can be customized in a game which directly do not affect the in-game strategies but add to the experience.

telegram from kr


Telegram C# Programming Guide
FROM USA