‫۵ سال و ۳ ماه قبل، دوشنبه ۲۰ خرداد ۱۳۹۸، ساعت ۱۵:۱۷
ارتقاء به EF Core 3.0
تا پیش از EF Core 3.0، استفاده از قابلیت Client-Side Evaluation در هر قسمتی از کوئری میسر است که سبب شده استفاده‌های نادرستی از آن صورت گیرد و کارآیی کوئر‌ی‌ها بی‌جهت کاهش یابد. از نگارش 3 به بعد، این نوع محاسبات فقط در قسمت Select نهایی مجاز است و نه هیچ قسمت دیگری از کوئری؛ در غیراینصورت یک استثناء را دریافت خواهید کرد. برای نمونه در مثالی که در اینجا ارائه شده، از متد ComputeHash در قسمت Where کوئری استفاده شده‌است که اکنون در EF Core 3.0 دیگر مجاز نیست. اگر نیاز است چنین کاری را انجام دهید، خودتان یک ToList را بر روی کوئری، فراخوانی کنید و سپس بر روی نتیجه‌ی LINQ to Objects حاصل، یک Where را بنویسید.
ارتقاء به EF Core 3.0
Query types که کمی بالاتر معرفی شد، در EF Core 3.0 منسوخ شده اعلام و با همان DbSet ادغام می‌شود (هدف آن کاهش سردرگمی بین DbQuery و DbSet است). در اینجا query type چیزی بجز یک entity بدون کلید نیست. بنابراین بجای تعریف ModelBuilder.Query، تنها از متد HasNoKey استفاده کنید؛ مانند ()ModelBuilder.Entity<>().HasNoKey. از این پس بجای DbQuery، از همان DbSet استفاده کنید. معادل DbContext.Query نیز DbContext.Set است.
‫۵ سال و ۳ ماه قبل، شنبه ۱۸ خرداد ۱۳۹۸، ساعت ۱۴:۴۰
یک نکته‌ی تکمیلی: تعریف متد AddConfig و عدم نیاز به استفاده‌ی از IOptions برای کار با آن
کدهای متد الحاقی AddConfig زیر:
services.AddConfig<MySettings>(Configuration.GetSection("MySettings"));
به این صورت تعریف شده‌است:
public static class ServiceCollectionExtensions
{
    public static TSettings AddConfig<TSettings>(this IServiceCollection services, IConfiguration configuration)
        where TSettings : class, new()
    {
        return services.AddConfig<TSettings>(configuration, options => { });
    }

    public static TSettings AddConfig<TSettings>(this IServiceCollection services, IConfiguration configuration, Action<BinderOptions> configureOptions)
        where TSettings : class, new()
    {
        if (services == null) { throw new ArgumentNullException(nameof(services)); }
        if (configuration == null) { throw new ArgumentNullException(nameof(configuration)); }
        TSettings setting = configuration.Get<TSettings>(configureOptions);
        services.TryAddSingleton(setting);
        return setting;
    }
}
در اینجا وهله‌ای از کلاس تنظیم خوانده شده را به صورت Singleton در سیستم ثبت می‌کند. بنابراین برای دریافت آن در برنامه، الزامی به استفاده‌ی از اینترفیس IOptions نبوده و می‌توان مستقیما خود کلاس تنظیم را به سازنده‌ی کلاس استفاده کننده‌ی از آن تزریق کرد:
private readonly MySettings _settings;

public MyViewComponent(MySettings settings)
{
    _settings = settings;
}
مزیت آن حذف وابستگی مرتبط با IOptions در قسمت‌های مختلف برنامه است.
‫۵ سال و ۳ ماه قبل، پنجشنبه ۱۶ خرداد ۱۳۹۸، ساعت ۱۵:۳۳
یک نکته‌ی تکمیلی: بهبود Null Coalescing Assignment در C# 8.0
ساده سازی انتساب مقداری به یک متغیر، اگر نال باشد:
- روش انجام اینکار تا پیش از C# 8.0
if (variable == null)
{
   variable = expression; // C# 1..7
}
- در C# 8.0
variable ??= expression; // C# 8
‫۵ سال و ۳ ماه قبل، پنجشنبه ۱۶ خرداد ۱۳۹۸، ساعت ۱۵:۰۹
چند مثال تکمیلی
- بررسی StatusCode یک HttpException توسط روش جدید نوشتن عبارات switch و pattern matching:
        private string HandleHttpError(Exception ex, string text)
        {
            switch(ex)
            {
                case HttpException httpEx:
                    return httpEx.StatusCode switch
                    {
                       404 => "[NOT FOUND]",
                       500 => "[INTERNAL SERVER ERROR]",
                       _ => text
                    };
                default:
                    return text;
            }
        }
- بررسی StatusCode یک HttpException توسط الگوهای خواص
        private string HandleHttpError(Exception ex, string text)
        {
            if (ex is HttpException { StatusCode: 404})
            {
                return $"[NOT FOUND]";
            }
            else if (ex is HttpException { StatusCode: 500})
            {
                return $"[INTERNAL SERVER ERROR]";
            }
            else
            {
                return text;
            }
        }