前言
上周去面試,跪了,這一年沒什么長進,還是挺慚愧的。
得到的評語是:想的太多,做的太少。
做了一份面試題,最后一題是數據庫的,寫個查詢。要查出Score有兩次及兩次以上超過79的Name和他的最高得分,同時顯示超過79分的次數。
表內容如下:
直接上Sql答案了。
兩種寫法:
1. 最簡單的方法,好像是萬能的,表不斷嵌套
select * from ( select Name, max(Score) as maxScore,count (name) as cnt from ( select * from Student where Score>79) as S1 group by Name) as S2 where S2.cnt>=2
最內層篩選出分數大於79的,取個別名S1,然后把S1結果用Name分組,然后得到每組的Name,max Score, count(name),然后結果取別名S2,然后用cnt過濾S2的cnt,得到超過2次的結果集合。
2. 用個with 來寫CTE,然后用一下having關鍵字。
with S1 as ( select * from Student where Score >79 ) select name, MAX (score) as maxScore, COUNT (name) as cnt from s1 group by name having COUNT (name)>=2
寫法好看了點,效率我也不知道怎么分析。。。有同學願意幫忙分析一下效率嗎。。。
執行上面兩個查詢,結果如下:
好了,言歸正傳,WCF入門。
第14集 實現IExtensibleDataObject接口所冒的風險 Risks of implementing IExtensibleDataObject interface
上一集,我們給DataContract 實現了IExtensibleDataObject接口,這個接口的ExtensionData屬性可以用來保存客戶端傳過來的額外的內容,當服務端把實體類序列化成xml回傳給客戶端時,會一並序列化這個屬性里面的內容,就可以避免客戶端的數據丟失。但是,這樣做有個缺點:
容易被DoS攻擊,因為這些額外的數據是保存在內容中的,如果客戶端傳過來一個較大的Object,那樣就會在服務器上占用大量的內存,服務器會因為內存不夠而無法提供正常的服務。
所以,現在的問題就是如何關閉這個特性。有下面幾種方法。
1. 最簡單的,DataContract類不實現IExtensibleDataObject接口,或者說移除DataContract類的IExtensibleDataObject接口實現,這樣做可以是可以,但是假如我們有很多個DataContract都實現了這個接口,那么就要所有的都移除,比較麻煩。
2. 改配置文件的方式。 如下:
<behaviors> <serviceBehaviors> <behavior name="mexBehavior"> <serviceMetadata httpGetEnabled="true" /> <dataContractSerializer ignoreExtensionDataObject ="true"/> </behavior> </serviceBehaviors> </behaviors>
給behaviors節點dataContractSerializer 增加一個ignoreExtensionDataObject ="true".
3.同理,也可以通過編程的方式實現。
[ServiceBehavior(IgnoreExtensionDataObject=true)] public class EmployeeService : IEmployeeService {...}
這集就這么點東西,Thank you。