۱ سال و ۵ ماه قبل، دوشنبه ۷ فروردین ۱۴۰۲، ساعت ۱۷:۳۶
۱ سال و ۵ ماه قبل، شنبه ۲۷ اسفند ۱۴۰۱، ساعت ۰۰:۱۱
بله. ولی نیازی به اینکار نیست. نگارش بعدی Blazor به همراه یک Grid توکار خواهد بود که هم اکنون هم قابل استفادهاست. به علاوه کامپوننتهای اختصاصی Blazor هم به همراه Grid نوشته شدهی با خود Blazor هستند.
۱ سال و ۵ ماه قبل، چهارشنبه ۲۴ اسفند ۱۴۰۱، ساعت ۱۷:۰۴
چگونه توسط EF Core، چندین کوئری را یکجا به بانک اطلاعاتی ارسال کنیم؟
روشی را که در این مطلب مشاهده کردید، در موارد مشابه دیگری هم قابل استفادهاست. برای مثال فرض کنید اطلاعات یک مشتری را قرار است به صورت زیر ذخیره کنیم:
public class Customer { public int Id { get; set; } public string Name { get; set; } = null!; public CustomerType Type { get; set; } } public enum CustomerType { Individual, Institution, }
حالت عادی کوئری گرفتن از اطلاعات جدول آن که به همراه صفحه بندی، نمایش تعداد رکوردها و یک کوئری دلخواه دیگر باشد، به صورت زیر است:
void ManyQueriesManyCalls() { using var scope = serviceProvider.CreateScope(); var context = scope.ServiceProvider.GetRequiredService<CustomerContext>(); var baseQuery = context.Customers.Select(customer => new { customer.Name, customer.Type, customer.Id, }); var total = baseQuery.Count(); var types = baseQuery.GroupBy(x => x.Type) .Select(x => x.Key).ToList(); var pageSize = 10; var pageIndex = 0; var results = baseQuery .OrderBy(x => x.Id) .Skip(pageSize * pageIndex) .Take(pageSize) .ToList(); Console.WriteLine($"Total:{total}, First Type: {types.First()}, First Item: {results.First().Name}"); }
SELECT COUNT(*) FROM [Customers] AS [c] SELECT [c].[Type] FROM [Customers] AS [c] GROUP BY [c].[Type] SELECT [c].[Name], [c].[Type], [c].[Id] FROM [Customers] AS [c] ORDER BY [c].[Id] OFFSET @__p_0 ROWS FETCH NEXT @__p_1 ROWS ONLY
اگر بخواهیم این سه کوئری را یکبار به سمت بانک اطلاعاتی ارسال کنیم، میتوان از همان ترفند گروه بندی مطرح شدهی در این مثال برای ترکیب کوئریها استفاده کرد:
void ManyQueriesOnCall() { using var scope = serviceProvider.CreateScope(); var context = scope.ServiceProvider.GetRequiredService<CustomerContext>(); var baseQuery = context.Customers.Select(customer => new { customer.Name, customer.Type, customer.Id, }); var pageSize = 10; var pageIndex = 0; var allTogether = baseQuery .GroupBy(x => 1) .Select(bq => new { Total = baseQuery.Count(), Types = baseQuery.GroupBy(x => x.Type) .Select(x => x.Key) .ToList(), Results = baseQuery .OrderBy(x => x.Id) .Skip(pageSize * pageIndex) .Take(pageSize) .ToList(), }) .FirstOrDefault(); Console.WriteLine($"Total:{allTogether.Total}, First Type: {allTogether.Types.First()}, First Item: {allTogether.Results.First().Name}"); }
SELECT [t0].[Key], [t1].[Type], [t2].[Name], [t2].[Type], [t2].[Id] FROM ( SELECT TOP(1) [t].[Key] FROM ( SELECT 1 AS [Key] FROM [Customers] AS [c] ) AS [t] GROUP BY [t].[Key] ) AS [t0] OUTER APPLY ( SELECT [c0].[Type] FROM [Customers] AS [c0] GROUP BY [c0].[Type] ) AS [t1] OUTER APPLY ( SELECT [c1].[Name], [c1].[Type], [c1].[Id] FROM [Customers] AS [c1] ORDER BY [c1].[Id] OFFSET @__p_1 ROWS FETCH NEXT @__pageSize_2 ROWS ONLY ) AS [t2] ORDER BY [t0].[Key], [t1].[Type], [t2].[Id]
کدهای این مثال را از اینجا میتوانید دریافت کنید: EF7ManyQueriesOneCall.zip
۱ سال و ۵ ماه قبل، چهارشنبه ۲۴ اسفند ۱۴۰۱، ساعت ۱۱:۰۰
از زمان C# 8x میتوان از شیء Range در متد Take نیز استفاده کرد:
۱ سال و ۵ ماه قبل، چهارشنبه ۲۴ اسفند ۱۴۰۱، ساعت ۱۰:۲۵
۱ سال و ۵ ماه قبل، دوشنبه ۲۲ اسفند ۱۴۰۱، ساعت ۱۴:۰۲
روش دیگری برای تغییر رشتههای اتصالی در زمان اجرا
به همراه مثالهای رسمی EF-Core 7x، مثال LazyConnectionStringSample.cs به این مورد پرداخته؛ برای اینکار یک DbConnectionInterceptor سفارشی را طراحی کرده که در متد ConnectionOpeningAsync بازنویسی شدهی آن، امکان تغییر رشتهی اتصالی جاری به صورت پویا وجود دارد:
public class ConnectionStringInitializationInterceptor : DbConnectionInterceptor { public override async ValueTask<InterceptionResult> ConnectionOpeningAsync( DbConnection connection, ConnectionEventData eventData, InterceptionResult result, CancellationToken cancellationToken = new()) { if (string.IsNullOrEmpty(connection.ConnectionString)) { connection.ConnectionString = "new data ..." ; } return result; } }
۱ سال و ۵ ماه قبل، یکشنبه ۲۱ اسفند ۱۴۰۱، ساعت ۱۰:۴۰
پروژهی pinvoke مایکروسافت، به همراه کتابخانهها و بستههای نیوگت رسمی برای سهولت دسترسی به امضاهای متدهای Win32 API است.
۱ سال و ۵ ماه قبل، یکشنبه ۲۱ اسفند ۱۴۰۱، ساعت ۱۰:۳۵
CsWin32، یک Source generator مخصوص تولید امضاهای DllImport توابع مرتبط با Win32 API از مایکروسافت
برای استفاده از آن، ابتدا بستهی نیوگت آنرا نصب کنید:
dotnet add package Microsoft.Windows.CsWin32 --prerelease
DwmRegisterThumbnail DwmUpdateThumbnailProperties DWM_TNP_*
پس از کامپایل برنامه، تعاریف این متدها، جزئی از برنامه خواهد شد.
۱ سال و ۵ ماه قبل، یکشنبه ۲۱ اسفند ۱۴۰۱، ساعت ۱۰:۲۵
۱ سال و ۵ ماه قبل، جمعه ۱۹ اسفند ۱۴۰۱، ساعت ۱۲:۵۶
چگونه از طریق خط فرمان یک بستهی نصب شدهی توسط libman را به روز کنیم؟
فقط کافی است در پوشهای که libman.json وجود دارد، دستور libman update packageName را صادر کنیم.