C# 6.0 內(nèi)插字符串(Interpolated Strings )的使用方法
看Interpolated Strings之前,讓我們先看EF Core 2.0 的一個新的特性:String interpolation in FromSql and
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的方法只是一個普通的字符串,已經(jīng)移除了花括號,并把變量替換成了對應(yīng)的值。FromSql獲取不到變量信息,怎么實現(xiàn)參數(shù)化查詢的呢? OK,讓我們從頭看起吧。
什么是內(nèi)插字符串 (Interpolated Strings)
內(nèi)插字符串是C# 6.0 引入的新的語法,它允許在字符串中插入表達(dá)式。
var name = "world";
Console.WriteLine($"hello {name}");
這種方式相對與之前的string.Format或者string.Concat更容易書寫,可讀性更高。就這點,已經(jīng)可以令大多數(shù)人滿意了。事實上,它不僅僅是一個簡單的字符串。
內(nèi)插字符串 (Interpolated Strings) 是什么?
用代碼來回答這個問題:
var name = "world";
string str1 = $"hello {name}"; //等于 var str1 = $"hello {name}";
IFormattable str2 = $"hello {name}";
FormattableString str3 = $"hello {name}";
可以看出,Interpolated Strings 可以隱式轉(zhuǎn)換為3種形式。實際上式編譯器默默的為我們做了轉(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 時代就有了,只有一個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 中的注意事項
因為隱式轉(zhuǎn)換的原因,在使用EF Core的FromSql 方法和 ExecuteSqlCommand方法時,需要特別小心。一不留神就會調(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();
}
第一種方法,因為sql的賦值被編譯成String.Format方法的調(diào)用,返回的是字符串。sql變量傳入FromSql方法時,又經(jīng)過一次System.String 到Microsoft.EntityFrameworkCore.RawSqlString隱式轉(zhuǎn)換。但sql變量本身已經(jīng)丟失了參數(shù)信息,所以無法實現(xiàn)參數(shù)化的查詢。
第四種方法, 也是Interpolated Strings -> String -> RawSqlString的轉(zhuǎn)換過程,但因為變量是分開傳入FromSql方法的,所以是以參數(shù)化的方式執(zhí)行的。
其他
熟悉ES2015的同學(xué)可以看看Javascript中的實現(xiàn),Tagged template literals,這和Interpolated Strings 非常類似。
昨晚凌晨12點發(fā)帖,不知道為什么被移除首頁了。感覺是篇幅不夠的原因,重新加了點EF Core注意事項,但超過1小時沒辦法重新回首頁了。七年來的第一篇文章,有點遺憾。希望大家喜歡。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- C#與C++?dll之間傳遞字符串string?wchar_t*?char*?IntPtr問題
- C#?BitArray(點矩陣)轉(zhuǎn)換成int和string的方法實現(xiàn)
- C#開發(fā)之int與string轉(zhuǎn)化操作
- C#中BitConverter.ToUInt16()和BitConverter.ToString()的簡單使用
- C#中字符串優(yōu)化String.Intern、IsInterned詳解
- C#中把字符串String轉(zhuǎn)換為整型Int的小例子
- c# StringBuilder.Replace 方法 (Char, Char, Int32, Int32)
- C#中String轉(zhuǎn)int的四種方法
相關(guān)文章
C#中Byte[]和String之間轉(zhuǎn)換的方法
很多朋友不清楚如何在Byte[]和String之間進(jìn)行轉(zhuǎn)換?下面小編給大家?guī)砹薭yte與string轉(zhuǎn)換的方法,感興趣的朋友參考下吧2016-08-08
C# 獲取指定QQ頭像繪制圓形頭像框GDI(Graphics)的方法
某論壇的評論區(qū)模塊,發(fā)現(xiàn)這功能很不錯,琢磨了一晚上做了大致一樣的,用來當(dāng)做 注冊模塊 的頭像綁定功能,下面通過實例代碼給大家介紹下C# 獲取指定QQ頭像繪制圓形頭像框GDI(Graphics)的方法,感興趣的朋友一起看看吧2021-11-11
C#中new和override的區(qū)別個人總結(jié)
這篇文章主要介紹了C#中new和override的區(qū)別個人總結(jié),本文以問答的方式講解了new和override的區(qū)別,需要的朋友可以參考下2015-06-06
使用C#調(diào)用百度地圖并實現(xiàn)坐標(biāo)點的設(shè)置以及讀取示例
這篇文章主要介紹了使用C#調(diào)用百度地圖并實現(xiàn)坐標(biāo)點的設(shè)置以及讀取示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
WPF自定義TreeView控件樣式實現(xiàn)QQ聯(lián)系人列表效果
TreeView控件在項目中使用比較頻繁,下面這篇文章主要給大家介紹了關(guān)于WPF自定義TreeView控件樣式實現(xiàn)QQ聯(lián)系人列表效果的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。2018-04-04

