Emre AYRILMAZ

.Net Denemeleri

Kullanışlı Visual Studio Kısa Yolları

İş sırasından oldukça sık kullandığım ve çok kullanışlı bulduğum kısa yolları sıralıyorum.

1 - Ctrl + Ğ
Aktif dökümanın Solution Explorer da seçilmesi/bulunması

2 - Ctr + U / Ctrl + Shft + U
Seçili metni küçük/büyük harfe çevirir

3 - Ctrl + Shft + B
Solution/Project derler

4 - Ctr + K / D
Aktif dökümanı tekrar formatlar. Eğe kodlamada hata varsa yapmaz !

5 - Ctr + K / K
Aktif satıra Bookmark ekler. Tekrarlanırsa kaldırır.

6 - Ctr + M / M
Aktif alanıscope (küme parantez) kapatırcollapse. Tekrarlanırsa açarexpand.

7 - Ctr + M / L
Tüm alanıscope (küme parantez) kapatırcollapse. Tekrarlanırsa açarexpand.

8 - Ctr + K / C - Ctr + K / U
Aktif satırı yada seçili alanı açıklamacommnet alanı içine alır. Diğeri ise tam tersi.

9 - Ctrl + Alt + L
Solution Explorer ı açar.

10 - Ctrl + ç + M
Team Explorer ı açar.

 

Etiketler: Visual Studio

Linq Lookup

Aşağıdaki gibi iki adet kelime dizisi olduğunu varsayalım.

string[] words1 = { "Don't", "play", "stupid", "with", "me", "I'am", "better", "at", "it" };
string[] words2 = { "I", "said", "Don't", "play", "stupid", "wiv", "me", "I", "be", "betta", "at", "it" };

Amacımız ortak kelimeleri bulmak olsun.

words1.ToLookup(p => words2.Contains(p)).Dump();

Lookup extension metodu sonuç olarak Dictionary döndürür. Şunun gibi;

lookup

Benzer elemanlar True olarak işaretlenenler. Son bir hamle ile sonlandıralım.

words1.ToLookup(p => words2.Contains(p)).Where(p => p.Key).Dump();

Etiketler: CSharp

Powershell İle Dosya Arşivleme

Tek bir dosyayı arşivleme

PS C:\> Compress-Archive -Path C:\Sounds\Halo.mp3 -DestinationPath C:\Sounds\Halo.zip

Birden fazla dosyayı arşivleme

PS C:\> Compress-Archive -Path C:\Sounds\Halo.mp3, C:\Sounds\Rockwell.mp3 -DestinationPath C:\Sounds\Ringtones.zip

Bir klasörü arşivleme

PS C:\> Compress-Archive -Path C:\Sounds\* -DestinationPath C:\Sounds.zip

Arşivleme komutu .Net Framework System.IO.Compression.ZipArchive API' sini kullandığı için maksimum 2gb dosya boyutu üzerinden işlem yapılabilir.

Arşivden tekrar çıkarmak için;

Expand-Archive -Path C:\Sounds.zip -DestinationPath C:\Sounds

Etiketler: Powershell

For Json

select col1,col2 from table1 for json auto | path

Artık sorgu sonuçlarını direk olaraj Json biçiminde alabilmekteyiz. Teknik olarak for xml ile aynı işlevsellikte verileri dışa aktarabiliriz.Günümüz modern web ve mobil uygulamaların sıkça tercih ettiği bir veri biçimi olduğundan Sql Server 2016 ile yerleşik olmasada baya bir destek geldiğini söyleyebiliriz.

Xml aynı zamanda bir veri tipi iken Json değildir. Buna karşın Json verilerini nvarchar olarak saklayıp özel fonksiyonlar ile sorgulayabilirsiniz

 Basit bir örnek yapalım.

t-sql json
select top 2
	P.ProductID,
	p.ProductName,
	p.UnitPrice,
	p.UnitsInStock
from Products P
for json auto
{
"Products":[
	{
		"ProductID":1,
		"ProductName":"Chai",
		"UnitPrice":18.0000,
		"UnitsInStock":39
	}
	,{
		"ProductID":2,
		"ProductName":"Chang",
		"UnitPrice":19.0000,
		"UnitsInStock":17
	}]
}

Şimdi örneği biraz ileri götürelim. İstemci uygulamasının web olduğunu ve Js tabanlı bir DataGrid kullandığımızı varsayalım.
Örneğin Bootgrid. Bootgrid, verileri listelemek ve sayfalamak için de bizden aşağıdaki gibi biçimde Json verisi ister.

[
	{
	"current":1,
	"rowCount":10,
	"rows":
	[
		{"ProductID":17,
		"ProductName":"Alice Mutton"
		,"UnitPrice":39.0000
		,"UnitsInStock":0},
		{"ProductID":3,
		"ProductName":"Aniseed Syrup",
		"UnitPrice":10.0000,
		"UnitsInStock":13},
		.....
	],
	"totals":77
	}
]

Şimdi onun istediği verilerin Json olarak dışarı aktaran t-sql kodunu yazalım.

--test için eklendi
--declare @current int = 1
--declare @rowCount int = 10

;with data as(
select
	P.ProductID,
	p.ProductName,
	p.UnitPrice,
	p.UnitsInStock
from Products P
)
select	@current as [current],
		@rowCount as [rowCount],
		(select
			TBL.*
		from [data] TBL
		order by TBL.ProductName
		offset ((@current - 1) * @rowCount) rows
		fetch next @rowCount rows only for json path) as [rows],
		(select count(*) from  [data]) as [totals]
for json path

Son olarak klasik Ado.Net ile verileri alalım.

SqlConnection con = new SqlConnection("Data Source=.;Initial Catalog=Northwind;Integrated Security=True");
SqlCommand com = new SqlCommand(@";with data as(
                                    select
	                                    P.ProductID,
	                                    p.ProductName,
	                                    p.UnitPrice,
	                                    p.UnitsInStock
                                    from Products P
                                    )
                                    select	@current as [current],
		                                    @rowCount as [rowCount],
		                                    (select
			                                    TBL.*
		                                    from [data] TBL
		                                    order by TBL.ProductName
		                                    offset ((@current - 1) * @rowCount) rows
		                                    fetch next @rowCount rows only for json path) as [rows],
		                                    (select count(*) from  [data]) as [totals]
                                    for json path", con);
com.Parameters.AddWithValue("@current", 1);
com.Parameters.AddWithValue("@rowCount", 10);
con.Open();
var jsonResult = new StringBuilder();
var reader = com.ExecuteReader();
if (!reader.HasRows)
{
    jsonResult.Append("[]");
}
else
{
    while (reader.Read())
    {
        jsonResult.Append(reader.GetValue(0).ToString());
    }
}
con.Close();

Tabiki de sadece bu kadar değil. DB seviyesinde bir kaç numara daha yapmanızı sağlacak hareketler mevcut. Neler mi?

OPENJSON

Bu fonksiyon yardımı ile nvarchar biçimde ki json verisini tablo verisine çevirmenize yarıyor.

Normal şartlarda "for json" komutu uyumluluk seviyesi 2014 de de çalışsa bile bu tip fonksiyonlarda ise mutlaka 2016 olması gerekiyor.

t-sql sonuç
declare @jsonData nvarchar(250)
set @jsonData = N'[
{ "id": 1 , "name" : "Chai", "price" : 18 },
{ "id": 2 , "name" : "Chang", "price" : 19 }
]'

select
	*
from OPENJSON(@jsonData)
--with ile schema eşleştirmesi yapılabiliyor
--ama kullanımı şart değil
WITH (
	ProductID int '$.id',
	ProductName nvarchar(50) '$.name',
	UnitPrice money '$.price')
OPENJSON

JSON_VALUE

Json formatında saklı veri üzerine işlem yapmanıza olanak verir. Aşağıdaki gibi bir ürün tablosu tasarlayalım.

Product Table

PropersitesÖzellikler tahmin edeceğiniz gibi Json biçiminde veri saklayacak. Amacımız, tüm ürünlerin özellik tanımları eşit olmayacağından dolayı şema bağımsız bir yapı elde etmek. Örnek veri ekleyelim.

insert Product
(Name,Price,Properties)
values
('Asus K890',
120,
N'{ "CPU" : "i5 6200U", "Ram" : "8 gb", "HDD" : "120 gb", "Screen" : "1920x1080" }'
)

Select atalım ama detaylı olsun :)

select
	TBL.Name,
	JSON_VALUE(Properties,'$.CPU') CPU,
	JSON_VALUE(Properties,'$.Ram') Ram,
	JSON_VALUE(Properties,'$.HDD') HDD,
	JSON_VALUE(Properties,'$.Screen') Screen
from Product TBL
where Id = 1 and ISJSON(Properties) = 1

Json Value Result

JSON_MODIFY

Json formatında saklı verileri güncellemek için kullanılır. Bir önceki örnekten devam edelim.

UPDATE Product  
SET Properties = JSON_MODIFY(Properties, '$.Ram', '4 gb')  
WHERE Id = 1

Selametle

Etiketler: CSharp Ado Net Sql

Metot ile Kod Kısaltma

Uygulama içinde üç tamsayıInteger dan en büyük olanını tespit etmemiz icap etti
	int a = 10
	int b = 1
	int c = 9

	int biggest = a
	
	if (biggest < b)
		biggest = b
	if (biggest < c)
		biggest = c
		
	Console.WriteLine(biggest)
yada bir metot yardımı ile daha basite indirgeyebiliriz
int Biggest(params int[] numbers)
{
	//eski yöntem ile
	//Array.Sort(numbers)
	//Array.Reverse(numbers)
	
	//linq ten sonra
	numbers.OrderByDescending(p => p)
	
	return numbers[0]
}
kullanımı
	int a = 10
	int b = 1
	int c = 9
		
	Console.WriteLine(Biggest(a,b,c))

Etiketler: CSharp