پشتیبانی رسمی RethinkDB از Windows
کش درون حافظه ای در asp.net core
با توجه به قابلیتهای In-memory جدید آن. حتی ابزار هم برای اینکار تهیه کردهاند .
چطور باید از Session در WebApi استفاده کرد؟
الزاما نیازی نیست که از Redis استفاده کنید؛ چون Distributed Memory Cache هم داریم (^):
builder.Services.AddDistributedMemoryCache();
ExtCore allows you to decouple your application into the modules (or extensions) and reuse that modules in other applications in various combinations. Each ExtCore extension may consist of one or more projects and each project may include everything you want (as any other ASP.NET Core project). Controllers, view components, views (added as resources and/or precompiled), static content (added as resources) will be resolved automatically. These projects (extension pieces) may be added to the application directly as dependencies in project.json of your main application project (as source code or NuGet packages), or by copying compiled DLL-files to the Extensions folder. ExtCore supports both of these approaches out of the box and at the same time.
Visual Studio 2017 15.5.7 منتشر شد
Team Explorer support for TLSv1.2
- We have updated the Git and the Git Credential Manager components that ship in Visual Studio.
- The optional Git for Windows component has also been updated.
- This update allows Git to connect to services that have deprecated support for TLSv1 and TLSv1.1 in favor of TLSv1.2.
Issues Fixed in this Release
These are the customer-reported issues addressed in this release:
- Projects targeting .NET Core 2.1 or newer are not supported by Visual Studio 2017 version 15.5.
- Fixed issue where installation of the SDK for .NET Core 2.1 or newer would cause the option to create ASP.NET Core 2.0 Web applications to disappear.
// -- FilteredInclude_EFCore5 var list = dbContext.Blogs .AsNoTracking() .Include(p => p.Posts.Where(p => p.Title.Contains("test title"))) .ToList(); return Json(list);
System.InvalidOperationException: 'Lambda expression used inside Include is not valid.'
// -- NonFilteredInclude var list = dbContext.Blogs .AsNoTracking() .Include(e => e.Posts) .ToList(); list.ForEach(p => p.Posts = p.Posts.Where(p => p.Title.Contains("test title")).ToList());
// -- Projection_Manually var list = dbContext.Blogs .AsNoTracking() .Select(p => new { p.Id, p.Name, Posts = p.Posts.Where(p => p.Title.Contains("test title")).ToList() }).ToList();
SELECT [b].[Id], [b].[Name], [t].[Id], [t].[BlogId], [t].[Description], [t].[Title] FROM [Blogs] AS [b] LEFT JOIN ( SELECT [p].[Id], [p].[BlogId], [p].[Description], [p].[Title] FROM [Posts] AS [p] WHERE CHARINDEX(N'test title', [p].[Title]) > 0 ) AS [t] ON [b].[Id] = [t].[BlogId] ORDER BY [b].[Id], [t].[Id]
- در صورت نیاز به ویرایش (عدم استفاده از AsNoTracking) بدلیل استفاده از anonymous بجای Blog، هیچ شیء Blog ایی در ChangeTracker ثبت نخواهد شد، ولی اشیا Post در ChangeTracker ثبت میشوند. در نتیجه تنها 1 شیء در ChangeTracker اضافه خواهد شد.
- کد نویسی را کثیف میکند؛ مخصوصا اگر نیاز به شرط گذاری بر روی چندین Navigation Collection تو در تو را داشته باشید.
// -- IncludeFilter_EFCorePlus var list = dbContext.Blogs .AsNoTracking() .IncludeFilter(e => e.Posts.Where(p => p.Title.Contains("test tile"))) .ToList();
-- EF+ Query Future: 1 of 2 SELECT [b].[Id], [b].[Name] FROM [Blogs] AS [b] ; -- EF+ Query Future: 2 of 2 SELECT [t].[Id], [t].[BlogId], [t].[Description], [t].[Title] FROM [Blogs] AS [b] INNER JOIN ( SELECT [p].[Id], [p].[BlogId], [p].[Description], [p].[Title] FROM [Posts] AS [p] WHERE CHARINDEX(N'test title', [p].[Title]) > 0 ) AS [t] ON [b].[Id] = [t].[BlogId] ;
- همانطور که میبینید این دستور، 2 کوئری را اجرا میکند. سرعت آن از روش قبلی کمی کندتر است و memory allocation بیشتری را انجام میدهد.
- در صورت عدم استفاده از AsNoTracking، اشیاء Blog را نیز ثبت میکند؛ درنتیجه تعداد 101 آبجکت (100 Blog و 1 Post) به ChangeTracker اضافه خواهند شد.
- کد نویسی تمیزتر و راحتتری در سمت سی شارپ دارد.
- این روش در EF6 نیز قابل استفاده است.
// -- FilteredInclude_EFCore5 var list = dbContext.Blogs .AsNoTracking() .Include(p => p.Posts.Where(p => p.Title.Contains("test title"))) .ToList();
SELECT [b].[Id], [b].[Name], [t].[Id], [t].[BlogId], [t].[Description], [t].[Title] FROM [Blogs] AS [b] LEFT JOIN ( SELECT [p].[Id], [p].[BlogId], [p].[Description], [p].[Title] FROM [Posts] AS [p] WHERE CHARINDEX(N'test title', [p].[Title]) > 0 ) AS [t] ON [b].[Id] = [t].[BlogId] ORDER BY [b].[Id], [t].[Id]
- این روش بسیار بهینه است و از روش قبلی (دوم) کمی سریعتر بوده و memory allocation کمتری (نزدیک به روش اول) دارد.
- در صورت عدم استفاده از AsNoTracking، مانند قبلی عمل میکند؛ درنتیجه تعداد 101 آبجکت به ChangeTracker اضافه خواهند شد.
- کد نویسی تمیزتر و راحتتری در سمت سی شارپ دارد.