جهت اطلاع
این سری برای ASP.NET Core 2x تهیه شد و با آخرین نگارش Identity server و همچنین ASP.NET Core سازگار نیست. برای اعمال آخرین تغییرات مورد نیاز این دو، تمام قسمت‌های این سری باید بازنویسی کلی شوند که ... خارج است از امکانات ما. به همین جهت مخزن کد آن در حالت آرشیو قرار گرفته تا این موضوع مشخص باشد.
‫۴ سال و ۱ ماه قبل، سه‌شنبه ۱۴ مرداد ۱۳۹۹، ساعت ۰۵:۲۵
من قصد نگه داری و به روز رسانی این سری را ندارم؛ چون نیاز به بازنویسی کلی را بر اساس آخرین تغییرات آن دارد. مخزن کد آن هم در حالت آرشیو قرار گرفته تا کاملا مشخص باشد. هدف اگر آشنایی و معرفی راه بوده، انجام شده؛ هدف دیگری نیست.
‫۴ سال و ۱ ماه قبل، یکشنبه ۱۲ مرداد ۱۳۹۹، ساعت ۰۵:۵۱
اگر جستجوی مدنظر چنین شکلی را داشته باشد:

مدلسازی نمونه‌ی آن به صورت زیر است:

    public class UIModel
    {
        public int PersianYear { set; get; }

        public int[] SelectedPersianMonths { set; get; }
    }
برای مثال اگر اطلاعات دریافتی از کاربر به صورت زیر باشد:
var model = new UIModel
{
    PersianYear = 1391,
    SelectedPersianMonths = new[] { 4, 5 }
};
کوئری گرفتن بر اساس ماه‌های انتخابی را (new DateTime را می‌توانید با پارامتر PersianCalendar تعریف کنید و ... کار می‌کند) باید بر اساس OR نوشت (حالت پیش‌فرض زنجیروار نوشتن Whereها And است):
var itemsQuery = context.Members.AsQueryable();

// Linq chaining where clauses as an `Or` instead of `And`
var predicate = PredicateBuilder.False<Member>();

foreach (var month in model.SelectedPersianMonths)
{
    var start = new DateTime(model.PersianYear, month, 1, new PersianCalendar());
    var end = new DateTime(model.PersianYear, month, month <= 6 ? 31 : 30, new PersianCalendar());

    // We can chain `IQueryable`s.
    // itemsQuery = itemsQuery.Where(x => x.JoinDate.Date >= start && x.JoinDate.Date <= end);
    // But it will be translated as an `AND`, not `OR`

    predicate = predicate.Or(x => x.JoinDate.Date >= start && x.JoinDate.Date <= end);
}

itemsQuery = itemsQuery.Where(predicate);

var items = itemsQuery.Select(x => new { x.FirstName, x.Surname }).ToList();
که یک چنین خروجی SQL ای را تولید می‌کند:
SELECT [m].[FirstName],
       [m].[Surname]
FROM   [Members] AS [m]
WHERE  ((CONVERT (DATE, [m].[JoinDate]) >= '2012-06-21T00:00:00')
        AND (CONVERT (DATE, [m].[JoinDate]) <= '2012-07-21T00:00:00'))
       OR ((CONVERT (DATE, [m].[JoinDate]) >= '2012-07-22T00:00:00')
           AND (CONVERT (DATE, [m].[JoinDate]) <= '2012-08-21T00:00:00'));
مثال کامل آن
- روش قدیمی استفاده‌ی از فایل app_offline.htm با انواع و اقسام برنامه‌های هاست شده‌ی در IIS کار می‌کند (حتی با ASP.NET Core)؛ البته آنچنان قابلیت سفارشی سازی ندارد.
- بررسی وجود یک فایل به ازای هر درخواست رسیده، بار IO سنگینی را در سایت ایجاد می‌کند. خود ASP.NET و تمام مشتقات آن از file watcher برای اطلاع از تغییرات رخ‌داده استفاده می‌کنند (یک مثال). حتی در ASP.NET Core هم از همین روش برای بررسی تغییرات فایل‌های config و reload اطلاعات مرتبط با آن‌ها استفاده می‌شود.
- یک روش دیگر برای عدم بررسی هرباره‌ی وجود فایل، ایجاد دو اکشن متد GoOffline و GoOnline است. در اولی یک متغیر استاتیک (کش کردن اطلاعات) را true می‌کنید و در دومی false. سپس این متغیر (یا کش) در فیلتر شما خوانده می‌شود، بجای اینکه هربار بررسی وجود فایل انجام شود.
فراخوانی history.push به معنای پایان اجرای کدهای این قسمت نیست. به همین جهت یک return history.push نیاز است. نمونه‌اش در اینجا بحث شده: «... همچنین به return ای هم که به همراه متد replace استفاده شده، دقت کنید. کار redirect به یک صفحه‌ی دیگر، به معنای عدم اجرای کدهای پس از آن نیست. بنابراین اگر می‌خواهیم کار این متد با redirect، به پایان برسد، ذکر return الزامی است... »
بله. هدف ثبت اطلاعات ابتدایی فایل SQL همراه آن در بانک اطلاعاتی است. این IDها هم به علت رابطه‌هایی که بین جداول وجود دارند، باید به همین نحو و با همین مقدارها ثبت شوند.
‫۴ سال و ۱ ماه قبل، پنجشنبه ۲ مرداد ۱۳۹۹، ساعت ۱۹:۱۶
- factory.Create به معنای ندیدگرفتن تنظیمات قبلی و ارائه یک وهله ساز جدید هست (یعنی قبلی از کار می‌افتد و فقط پروایدر جدید کار می‌کند).
- این مورد را الان آزمایش کردم و کار می‌کند:
return factory.Create(
     baseName: "SharedResource",
     location: "Core3xRtmTestResources.ExternalResources"  //نام اسمبلی ثالث
);
همان مثال نگارش 1x پیوست در نظرات هست که به نگارش 3x ارتقاء داده شده: Core3xRtmTestResources.zip
روی دکمه صفحه‌ی اول آن کلیک کنید (بعد از کلیک بر روی لینک فارسی سازی)، پیام خطا را از فایل shared می‌خواند.