NET Core 3.1 Preview 2. منتشر شد
1.Visual Studio 2017 15.6 منتشر شد
These are the customer-reported issues addressed in this release:
بدست آوردن برگهای یک درخت توسط Recursive CTE
آیا نتیجه مورد نظر شما به صورت الحاق یافته (concatenated) هست یا نه؟
در هر صورت باید یکی از دو query زیر نتیجه مورد نظر شما را تولید کند.
declare @t table (id char(1) primary key, parent char(1)); insert @t values ('A',null), --Level 1 ('B', 'A'), ('C', 'A'), --Level 2 ('D', 'B'), ('E', 'B'),('R','B'), ('F', 'C'), --Level 3 ('G', 'D'), --Level 4 ('H', 'G'), ('I', 'G'); --Level 5 ;with cte as ( select id, rnk=0, concats = cast(id as varchar(10)) from @t where parent is null union all select t.id, rnk+1, cast(cte.concats + t.id as varchar(10)) from cte join @t t on cte.id = t.parent ) select * from cte /* id rnk concats ---- ----------- ---------- A 0 A B 1 AB C 1 AC F 2 ACF D 2 ABD E 2 ABE R 2 ABR G 3 ABDG H 4 ABDGH I 4 ABDGI */ ;with cte as ( select id, rnk=0, concats = cast(id as varchar(10)) from @t where parent is null union all select t.id, rnk+1, cast(cte.concats + t.id as varchar(10)) from cte join @t t on cte.id = t.parent ) select stuff(d.list,1,1,'') as concats from (select ','+concats from cte for xml path(''))d(list) /* concats ---------------------------------------- A,AB,AC,ACF,ABD,ABE,ABR,ABDG,ABDGH,ABDGI */
موفق باشید
وضعیت جدید decorators در جاوااسکریپت
Currently at stage 2 in TC39’s process and due to be discussed in more depth this month, decorators provide a way to extend methods and other ‘syntax forms’ by wrapping them with other functionality. Note that this proposal differs from the decorators proposed to TC39 in 2018, that Babel 7 supports, and that inspired ‘experimental’ decorators in TypeScript .
This article dives into the mock questions I would ask, along with responses that are my personal best guess to the answers. Could my answers not reflect actual opinions shared by the team at Microsoft? Sure, but I'm hoping folks from the .NET team can jump in to correct me if I am way off base.
This is a rather interesting time for .NET – what's being done shapes the future of .NET for the next decade. Let's ask the honest questions and hopefully all of us will understand the new .NET ecosystem a little better.
مشکلی که در دراز مدت با SQLDom وجود خواهد داشت، مواردی مانند SelectStarExpression و CreateProcedureStatement و امثال آن هستند. اینها را از کجا باید تشخیص داد؟ همچنین مراحل بررسی این اجزاء، نسبتا طولانی هستند و نیاز به یک راه حل عمومیتر در این زمینه وجود دارد.
راه حلی برای این مشکل در مطلب «XML ‘Visualizer’ for the TransactSql.ScriptDom parse tree» ارائه شدهاست. در اینجا تمام اجزای TSqlFragment توسط Reflection مورد بررسی و استخراج قرار گرفته و نهایتا یک فایل XML از آن حاصل میشود.
اگر نکات ذکر شده در این مقاله را تبدیل به یک برنامه با استفاده مجدد کنیم، به چنین شکلی خواهیم رسید:
این برنامه را از اینجا میتوانید دریافت کنید:
DomToXml.zip
همانطور که در تصویر مشاهده میکنید، اینبار به سادگی، SelectStarExpression قابل تشخیص است و تنها کافی است در T-SQL پردازش شده، به دنبال SelectStarExpressionها بود. برای اینکار جهت ساده شدن آنالیز میتوان با ارث بری از کلاس پایه TSqlFragmentVisitor شروع کرد:
using System; using System.Linq; using Microsoft.SqlServer.TransactSql.ScriptDom; namespace DbCop { public class SelectStarExpressionVisitor : TSqlFragmentVisitor { public override void ExplicitVisit(SelectStarExpression node) { Console.WriteLine( "`Select *` detected @StartOffset:{0}, Line:{1}, T-SQL: {2}", node.StartOffset, node.StartLine, string.Join(string.Empty, node.ScriptTokenStream.Select(x => x.Text)).Trim()); base.ExplicitVisit(node); } } }
مرحلهی بعد، اجرای این کلاس Visitor است:
public static class GenericVisitor { public static void Start(string tSql, TSqlFragmentVisitor visitor) { IList<ParseError> errors; TSqlScript sqlFragment; using (var reader = new StringReader(tSql)) { var parser = new TSql120Parser(initialQuotedIdentifiers: true); sqlFragment = (TSqlScript)parser.Parse(reader, out errors); } if (errors != null && errors.Any()) { var sb = new StringBuilder(); foreach (var error in errors) sb.AppendLine(error.Message); throw new InvalidOperationException(sb.ToString()); } sqlFragment.Accept(visitor); } }
مثالی از نحوهی استفاده از کلاس GenericVisitor فوق را در اینجا ملاحظه میکنید:
var tsql = @"WITH ctex AS ( SELECT * FROM sys.objects ) SELECT * FROM ctex"; GenericVisitor.Start(tsql, new SelectStarExpressionVisitor());
معرفی List Patterns Matching در C# 11
var data = "item1|item2|item3"; var collection = data.Split('|');
var formattedDataBefore = collection.Length switch { 2 => FormatData(collection[0], collection[1]), 3 => FormatData(collection[0], collection[1], collection[2]), var length => throw new InvalidOperationException($"Expected 3 parts, but got {length} parts for formatted string: {data}."), };
var formattedDataAfter = collection switch { [var part1, var part2] => FormatData(part1, part2), [var part1, var part2, var part3] => FormatData(part1, part2, part3), var parts => throw new InvalidOperationException($"Expected 3 parts, but got {parts.Length} parts for formatted string: {data}."), };
نمونهی دیگر این دسترسیهای بر اساس ایندکسها، مثال زیر است. در اینجا ساختار شیء Song به صورت زیر تعریف شدهاست:
public class Song { public string Name { get; set; } public List<string> Lyrics { get; set; } }
for (var i = 0; i < songs.Count; i++) { if (songs[i].Lyrics[0] == "Hello" && songs[i].Lyrics.Count == 6 && songs[i].Lyrics[songs[i].Lyrics.Count - 1] == "?") { Console.WriteLine($"{i}"); } }
for (var i = 0; i < songs.Count; i++) { if (songs[i].Lyrics is ["Hello", _, _, _, _, "?"]) { Console.WriteLine($"{i}"); } }
foreach (Song song in songs) { if (song.Lyrics is ["Hello", .., "?"]) { Console.WriteLine(song.Name); } }
foreach (Song song in songs) { if (song.Lyrics is ["Hello", "from" or "is", var third, var forth, var fifth]) { Console.WriteLine(song.Name); Console.WriteLine($"The third word is : {third}"); Console.WriteLine($"The forth word is : {forth}"); Console.WriteLine($"The fifth word is : {fifth}"); } }
اگر بخواهید در کد وب پارت خود از ویژگی Session استفاده کنید ، ممکن است SharePoint این اجازه را به شما ندهد... راه حل چیست؟
اگر کد خود را بعد از پیاده سازی Session اجرا کنید چنین پیغامی را مشاهده خواهید کرد:
این پیغام نشان می دهد که تنظیمات Session در فایل web.config فعال نیست .یکی از راه حل های این مشکل چک کردن ویژگی enableSessionState="true" در هدر صفحه و در تگ Page است
اگر این ویژگی True باشد و همچنان همان پیغام فوق را مشاهده کردید به فایلweb.config وبسایت مورد نظر مراجعه کرده و به روش زیر عمل کنید :
// 1 - Find This Node <modules runAllManagedModulesForAllRequests="true"> // 2 - Add These Nodes <remove name="Session" /> <add name="Session" type="System.Web.SessionState.SessionStateModule" preCondition="" />
اکنون امکان استفاده از Session برای شما فراهم شده است .
در غیر این صورت باید تغییراتی در Permission Policy های شیرپوینت که در فایل های wss_minimaltrust.config و wss_mediumtrust.config و ... انجام دهید و یک Permission Set به آن اضافه کنید
این فایل ها در زیر مجموعه 14 و در پوشه CONFIG قرار دارند .
موفق باشید