#LINQ
❇️ 5 usefull tips to write cleaner LINQ code
🔹در این پست قصد داریم چند توصیه در هنگام نوشتن کوئری های Linq به شما دهیم که باعث خوانا تر شدن کوئری ها میشود.
🔸کوئری های linq علاوه بر ساده بودن زیبایی خاصی نیز دارند و بدون شک در صورتی که به درستی نوشته شود پرفورمنس بالایی هم دارند.
برای پرهیز کردن از اشتباهات احتمالی در هنگام نوشتن کوئری های linq باید قوانینی را برای خود مشخص کنید و بدین ترتیب بروز باگ و خطاهای احتمالی کاهش میابد.
در ادامه پنج نوع از این قوانین را معرفی میکنیم.
1️⃣ Two chained methods
هنگامی که کوئری ای مینویسید که فقط دارای دو Linq متد است و کوئری تان به یک eager linq متد ختم می شود. میتوانید کل کوئری خود را در یک خط قرار دهید.
2️⃣ اگر کوئری تان بیش از دو متد دارد باز هم هر متد را در خط جدیدی قرار دهید.
3️⃣ Don’t iterate IQueryable<T> by using keyword foreach.
🔹در این قانون شما را با اصلی آشنا میکنیم با عنوان
💎 “explicit is better than implicit”.
🔸در هنگام بررسی کدها و حتی خواندن کدهای دیگران اگر جایی از کد بروی یک IQuerable حلقه زده باشید(به وسیله foreach), خوانایی و درک کد کاهش میابد (البته این یک نظر شخصی است) . همچنین ممکن است کسی که کدتان را میخواند این مسئله را فراموش کرده باشد یا نداند که در foreach باعث اجرا شدن این کوئری میشود.
روش بهتر این است که ابتدا کوئری را اجرا کرده و سپس بروی آن حلقه بزنید.
🔸از طولانی و بزرگ شدن بدنه lambda های درون کوئری تا حد ممکن بپرهیزید در برخی موارد اگر lambda ای چند خط به عنوان بدنه داشته باشد باعث خوانایی کد میشود اما در اکثر مواقع از خوانایی کوئری می کاهد.
🔸در هنگام کار کردن با EF از این دست قبیل قوانین که غالبا شخصی هستند بسیار وجود دارد به عنوان مثال
فرض کنید نیاز به نوشتن linq کوئری داریم که براساس شروطی, داده هایی رو از دیتابیس واکشی کند و در قسمتی دیگری از کد بروی داده های واکشی شده کارهای دیگری انجام دهیم.(فرایند اجرا شدن این کارها در حافظه انجام میشود و قابل ترجمه به کوئری sql نیستند)
▫️روش اشتباه نوشتن این کوئری بدین صورت است
❇️ 5 usefull tips to write cleaner LINQ code
🔹در این پست قصد داریم چند توصیه در هنگام نوشتن کوئری های Linq به شما دهیم که باعث خوانا تر شدن کوئری ها میشود.
🔸کوئری های linq علاوه بر ساده بودن زیبایی خاصی نیز دارند و بدون شک در صورتی که به درستی نوشته شود پرفورمنس بالایی هم دارند.
برای پرهیز کردن از اشتباهات احتمالی در هنگام نوشتن کوئری های linq باید قوانینی را برای خود مشخص کنید و بدین ترتیب بروز باگ و خطاهای احتمالی کاهش میابد.
در ادامه پنج نوع از این قوانین را معرفی میکنیم.
1️⃣ Two chained methods
هنگامی که کوئری ای مینویسید که فقط دارای دو Linq متد است و کوئری تان به یک eager linq متد ختم می شود. میتوانید کل کوئری خود را در یک خط قرار دهید.
var userList = GetDataSource().Where(p => p.Email.Contains("@foo.com")).ToList();در غیر اینصورت کوئری خود را در چند خط بنویسید.
var userList = GetDataSource()▫️اگه در مورد eager linq متدها اطلاعاتی محدودی دارید این مقاله را مطالعه نمایید.
.Where(p => p.Email.Contains("@foo.com"))
.Select(s => s.Email);
2️⃣ اگر کوئری تان بیش از دو متد دارد باز هم هر متد را در خط جدیدی قرار دهید.
3️⃣ Don’t iterate IQueryable<T> by using keyword foreach.
🔹در این قانون شما را با اصلی آشنا میکنیم با عنوان
💎 “explicit is better than implicit”.
🔸در هنگام بررسی کدها و حتی خواندن کدهای دیگران اگر جایی از کد بروی یک IQuerable حلقه زده باشید(به وسیله foreach), خوانایی و درک کد کاهش میابد (البته این یک نظر شخصی است) . همچنین ممکن است کسی که کدتان را میخواند این مسئله را فراموش کرده باشد یا نداند که در foreach باعث اجرا شدن این کوئری میشود.
روش بهتر این است که ابتدا کوئری را اجرا کرده و سپس بروی آن حلقه بزنید.
var usersEmailList = GetDataSource()
.Where(p => p.Email.Contains("@foo.com"))
.Select(user => user.Email);
.ToList();
foreach (var user in usersEmailList)
{
...
}
4️⃣ Long Lambda statement is not okay.🔸از طولانی و بزرگ شدن بدنه lambda های درون کوئری تا حد ممکن بپرهیزید در برخی موارد اگر lambda ای چند خط به عنوان بدنه داشته باشد باعث خوانایی کد میشود اما در اکثر مواقع از خوانایی کوئری می کاهد.
someQuery.Select(p => {
var newUser = new User
{
Name = p.Name,
Age = p.Age
}
});
5️⃣ Entity Framework🔸در هنگام کار کردن با EF از این دست قبیل قوانین که غالبا شخصی هستند بسیار وجود دارد به عنوان مثال
فرض کنید نیاز به نوشتن linq کوئری داریم که براساس شروطی, داده هایی رو از دیتابیس واکشی کند و در قسمتی دیگری از کد بروی داده های واکشی شده کارهای دیگری انجام دهیم.(فرایند اجرا شدن این کارها در حافظه انجام میشود و قابل ترجمه به کوئری sql نیستند)
▫️روش اشتباه نوشتن این کوئری بدین صورت است
var usersEmailList = GetSomeDbSet()
.Where(p => p.Email.Contains("@foo.com"))
.Select(user => user.Email)
.ToList()
.Select(SomeTransoformationInMemory);
🔸 بدین منظور باید کوئری خود را به دو بخش تقسیم کرده و عملیاتی را که قابل ترجمه هستند را ابتدا در کوئری که به سمت دیتابیس ارسال میشود, اجرا کنند و بقیه عملیات را بروی داده های واکشی شده انجام دهید.var usersEmailListFromDB = GetSomeDbSet()
.Where(p => p.Email.Contains("@foo.com"))
.Select(user => user.Email)
.ToList();
var usersEmailList = usersEmailListFromDB.Select(SomeTransoformationInMemory).ToList();
@fullStackDevsmithunvp.com
THREE examples of Deferred vs. Immediate execution in LINQ using C# - mithunvp.com
Understanding difference between deferred and immediate execution of LINQ query with three examples. Language-Integrated Query is full form of LINQ
#LINQ
C# LINQ Mind Map
Here a simple mind map for beginners to get an overview over the waste variety off LINQ operations grouped into categories.
This mind map is taken from my free eBook: "LINQ explained with sketches - the eBook" - which I update regularly. I hope that gives a better picture, especially for beginners.
The download link for the free ebook: https://lnkd.in/dG3K8vCW
✏️ Steven Giesel
@fullStackDevs
C# LINQ Mind Map
Here a simple mind map for beginners to get an overview over the waste variety off LINQ operations grouped into categories.
This mind map is taken from my free eBook: "LINQ explained with sketches - the eBook" - which I update regularly. I hope that gives a better picture, especially for beginners.
The download link for the free ebook: https://lnkd.in/dG3K8vCW
✏️ Steven Giesel
@fullStackDevs
👍9
#chunk
#linq
💡مجموعه اسپیلیت ( split) با LINQ Chunk💡
اگر نیاز دارید که مجموعه و یا collection ای را به مجموعه های کوچکتر بدون روش های اضافی تقسیم کنید، LINQ یک متد 𝗖𝗵𝘂𝗻𝗸 را که از 6 NET. معرفی شد ،پیشنهاد میکند.
تعداد سایز عنصر را به عنوان پارامتر در نظر می گیرد و سپس مجموعه را با حداکثر تعداد عنصر به مجموعه های کوچکتر تقسیم می کند.
در مثال فوق در chunkResult سه آرایه وجود خواهد داشت که تعداد دو مجموعه اول 5 و مجموعه سوم 4 آیتم وجود دارد.!
@fullStackDevs
#linq
💡مجموعه اسپیلیت ( split) با LINQ Chunk💡
اگر نیاز دارید که مجموعه و یا collection ای را به مجموعه های کوچکتر بدون روش های اضافی تقسیم کنید، LINQ یک متد 𝗖𝗵𝘂𝗻𝗸 را که از 6 NET. معرفی شد ،پیشنهاد میکند.
تعداد سایز عنصر را به عنوان پارامتر در نظر می گیرد و سپس مجموعه را با حداکثر تعداد عنصر به مجموعه های کوچکتر تقسیم می کند.
در مثال فوق در chunkResult سه آرایه وجود خواهد داشت که تعداد دو مجموعه اول 5 و مجموعه سوم 4 آیتم وجود دارد.!
@fullStackDevs
👍14