欧美成人午夜免费全部完,亚洲午夜福利精品久久,а√最新版在线天堂,另类亚洲综合区图片小说区,亚洲欧美日韩精品色xxx

扣丁學(xué)堂Java培訓(xùn)簡述C#6.0內(nèi)插字符串(Interpolated Strings )的使用方法

2019-07-26 15:38:10 3561瀏覽

本篇文章扣丁學(xué)堂Java培訓(xùn)小編給讀者們分享一下C#6.0內(nèi)插字符串(Interpolated Strings )的使用方法,對(duì)此感興趣的小伙伴就隨小編來了解一下吧,希望對(duì)小伙伴們有幫助。

扣丁學(xué)堂Java培訓(xùn)簡述C#6.0內(nèi)插字符串(Interpolated Strings )的使用方法


ExecuteSqlCommand


var city = "London";

using (var context = CreateContext())
{
 context.Customers
  .FromSql($@"
   SELECT *
   FROM Customers
   WHERE City = {city}")
  .ToArray();
}


SQL語句以參數(shù)化的方式執(zhí)行,所以是防字符串注入的。


@p0='London' (Size = 4000)

SELECT *
FROM Customers
WHERE City = @p0


一直認(rèn)為Interpolated Strings只是String.Format的語法糖,傳給FromSql的方法只是一個(gè)普通的字符串,已經(jīng)移除了花括號(hào),并把變量替換成了對(duì)應(yīng)的值。FromSql獲取不到變量信息,怎么實(shí)現(xiàn)參數(shù)化查詢的呢? OK,讓我們從頭看起吧。


什么是內(nèi)插字符串 (Interpolated Strings)


內(nèi)插字符串是C# 6.0 引入的新的語法,它允許在字符串中插入表達(dá)式。


var name = "world";
Console.WriteLine($"hello {name}");


這種方式相對(duì)與之前的string.Format或者string.Concat更容易書寫,可讀性更高。就這點(diǎn),已經(jīng)可以令大多數(shù)人滿意了。事實(shí)上,它不僅僅是一個(gè)簡單的字符串。


內(nèi)插字符串 (Interpolated Strings) 是什么?


用代碼來回答這個(gè)問題:


var name = "world";
string str1 = $"hello {name}"; //等于 var str1 = $"hello {name}";
IFormattable str2 = $"hello {name}";
FormattableString str3 = $"hello {name}";


可以看出,Interpolated Strings 可以隱式轉(zhuǎn)換為3種形式。實(shí)際上式編譯器默默的為我們做了轉(zhuǎn)換:


var name = "world";
string str1 = string.Format("hello {0}",name); //等于 var str1 = $"hello {name}";
IFormattable str2 = FormattableStringFactory.Create("hello {0}",name);
FormattableString str3 = FormattableStringFactory.Create("hello {0}",name);


IFormattable 從.net Framwork 1 時(shí)代就有了,只有一個(gè)ToString方法,可以傳入IFormatProvider來控制字符串的格式化。今天的主角不是他。

FormattableString 伴隨Interpolated Strings引入的新類。



FormattableString 是什么?


先看一段代碼


var name = "world";
FormattableString fmtString = $"hello {name}";
Console.WriteLine(fmtString.ArgumentCount); //1
Console.WriteLine(fmtString.Format); //hello {0}
foreach (var arg in fmtString.GetArguments())
{
 Console.WriteLine(arg); //world
 Console.WriteLine(arg.GetType()); //System.String
}


可以看出FormattableString保存了Interpolated Strings的所有信息,所以EF Core 2.0能夠以參數(shù)化的方式來執(zhí)行SQL了。


EF Core 中的注意事項(xiàng)


因?yàn)殡[式轉(zhuǎn)換的原因,在使用EF Core的FromSql 方法和 ExecuteSqlCommand方法時(shí),需要特別小心。一不留神就會(huì)調(diào)入陷阱。


var city = "London";

using (var context = CreateContext())
{
 //方法一,非參數(shù)化
 var sql = $" SELECT * FROM Customers WHERE City = {city}";
 context.Customers.FromSql(sql).ToArray();

 //方法二,參數(shù)化
 context.Customers.FromSql($" SELECT * FROM Customers WHERE City = {city}").ToArray();

 //方法三,參數(shù)化
 FormattableString fsql = $" SELECT * FROM Customers WHERE City = {city}";
 context.Customers.FromSql(fsql).ToArray();

 //方法四,非參數(shù)化
 var sql = " SELECT * FROM Customers WHERE City = @p0";
 context.Customers.FromSql(sql, city).ToArray();

}


第一種方法,因?yàn)閟ql的賦值被編譯成String.Format方法的調(diào)用,返回的是字符串。sql變量傳入FromSql方法時(shí),又經(jīng)過一次System.String 到Microsoft.EntityFrameworkCore.RawSqlString隱式轉(zhuǎn)換。但sql變量本身已經(jīng)丟失了參數(shù)信息,所以無法實(shí)現(xiàn)參數(shù)化的查詢。


第四種方法, 也是Interpolated Strings -> String -> RawSqlString的轉(zhuǎn)換過程,但因?yàn)樽兞渴欠珠_傳入FromSql方法的,所以是以參數(shù)化的方式執(zhí)行的。


想要了解更多關(guān)于Java開發(fā)方面內(nèi)容的小伙伴,請關(guān)注扣丁學(xué)堂Java培訓(xùn)官網(wǎng)、微信等平臺(tái),扣丁學(xué)堂IT職業(yè)在線學(xué)習(xí)教育有專業(yè)的Java講師為您指導(dǎo),此外扣丁學(xué)堂老師精心推出的Java視頻教程定能讓你快速掌握J(rèn)ava從入門到精通開發(fā)實(shí)戰(zhàn)技能。扣丁學(xué)堂Java技術(shù)交流群:850353792。


                        JavaEE/微服務(wù)/源碼解析/分布式/企業(yè)級(jí)架構(gòu)【VIP體驗(yàn)課】


     【關(guān)注微信公眾號(hào)獲取更多學(xué)習(xí)資料】       【掃碼進(jìn)入JavaEE/微服務(wù)VIP免費(fèi)公開課】  



查看更多關(guān)于“Java開發(fā)資訊”的相關(guān)文章>>


標(biāo)簽: Java培訓(xùn) Java視頻教程 Java多線程 Java面試題 Java學(xué)習(xí)視頻

熱門專區(qū)

暫無熱門資訊

課程推薦

微信
微博
15311698296

全國免費(fèi)咨詢熱線

郵箱:codingke@1000phone.com

官方群:148715490

北京千鋒互聯(lián)科技有限公司版權(quán)所有   北京市海淀區(qū)寶盛北里西區(qū)28號(hào)中關(guān)村智誠科創(chuàng)大廈4層
京ICP備2021002079號(hào)-2   Copyright ? 2017 - 2022
返回頂部 返回頂部