2011-04-08 77 views
0

考慮一個正常的LINQ表達式將是這樣的:
(這只是爲了讓大家更好的瞭解樣品)LINQ(L2E)與存儲過程和IQueryable的

IQueryable<Person> personQuery= (from ppl in PersonContext 
         select ppl).ASQueryable(); 


List<Person>personList = personQuery.where(x => x.age==13).ToList(); 

所以,如果我決定把存儲過程中的linq查詢的第一部分,
事情會發生這樣的事情。

IQueryable<Person> personQuery= PersonContext.sp_RetrievePerson().ASQueryable(); 

List<Person> personList = personQuery.where(x => x.age==13).ToList(); 

所以對於這個問題,我相信第一個方法只在調用toList()時發送sql調用。
換句話說,發送到SQL執行查詢將

Select * from Person where age=13 

但對於方法2,有多少次將這個查詢被執行發送?
如果它只發送一次,它是否使它成爲多餘的調用存儲過程作爲存儲過程知道有一個更快的執行和如何將查詢發送到SQL看起來像?

回答

2

我不確定這個,但PersonContext.sp_RetrievePerson()返回ObjectResult,它在內部使用DbDataReader。這意味着存儲過程被調用一次, personQuery.where(x => x.age==13)遍歷結果行並過濾出不匹配的對象。

通過使用此存儲過程,您可能會在查詢數據庫時獲得較小的性能提升,但您必須在從數據庫中讀取它之後評估個人表中的每個對象。所以我認爲在這種情況下,使用存儲過程只有在存儲過程提供參數age以過濾數據庫中已有的結果時纔有意義。

+0

這也是我所猜測的。因爲它比這個示例查詢更復雜。當談到外部聯接和聯合以及類似的事情時,我並不擅長SQL。但是我可以使用LINQ編碼更好地操作它,並且使其更容易。我使用的表格至少包含5個聯盟,其中聯盟段具有很多外部聯接。總而言之,那個寫這個查詢的人太敬虔了,但我不得不保持它。 – 2011-04-09 00:48:38