2010-10-15 56 views
6

我有一個方法,返回一組賬戶返回類型爲收集來自LINQ查詢

Public Shared Function GetAllNotesByUser(ByVal UserID As Guid) As Account (??) 
    Using db As New MyEntity 
     Dim query= (From A In db.Account _ 
        Where A.aspnet_Users.UserId = UserID _ 
        Select A) 
     Return query 
    End Using 
End Function 

話,我想這個傳遞給另一個函數來計算總計爲集合中的所有帳戶。返回一個Ienumerable,一個通用列表是否是最佳實踐,我只是不確定LINQ和實體框架最適合什麼。

回答

7

當以這種方式從方法傳播LINQ查詢結果時,返回類型的最佳選擇是LINQ to objects的IEnumerable(Of T)或其他LINQ提供者的IQueryable(Of T)。在這種情況下,看起來像Account的類型是IEnumerable(Of Account)IQueryable(Of T),具體取決於所討論的查詢類型。

+1

最好的選擇是'IEnumerable',除非最好的選擇是'IQueryable'。 ;) – 2010-10-15 16:37:01

+0

@Kirk,true。忘記關於非LINQ到這種情況的對象查詢 – JaredPar 2010-10-15 16:45:21

2

最好的類型是

IEnumerable<Account> 

或VB中的correspounding語法:P

其實,所有的LINQ功能(.Where().Distinct()等)的擴展方法IEnumerable<T>,到我覺得這是以相同的方式繼續連鎖的良好做法。

+0

我已經搜索了MSDN,但必須查找錯誤的地方。你怎麼知道WHERE()和Distinct()是IEnumerable的擴展方法。我不是在質疑你,我只是想知道下次我有類似的問題在哪裏看。 – 2010-10-28 01:44:44

+0

@Travis沒有問題。實際上,在MSDN中,這些擴展方法的定義並不明顯......但是您可以在IEnumerable (通用版本)的頁面上找到列表:http://msdn.microsoft.com/ en-us/library/9eekhta0.aspx。有一個小圖標表示它是一種擴展方法...當你點擊其中一個命令空間時,你可以看到它的命名空間......也就是說,爲了使用任何LINQ擴展方法,你需要在你的文件的頂部使用'System.Linq;'。 – tsimbalar 2010-10-28 07:10:13

+0

哦,我知道它的方式,只是因爲VS總是添加一個對'System.Linq'的引用,而Intellisense只是建議他們:-)。拋開引擎蓋,所有「linq」查詢式表達式都轉換成Linq擴展方法的鏈。 – tsimbalar 2010-10-28 07:14:25

0

您需要問的問題是:「我什麼時候需要SQL來實際執行?」在LINQ中,這是延遲執行和立即執行之間的區別。任何返回IEnumerable<>的方法都必須執行查詢才能獲得結果。另一方面,IQueryable<>會延遲查詢的執行,直到調用返回IEnumerable<>的方法爲止。在你提供的例子,它可能會更快的GetAllNotesByUser函數的結果通過爲IQueryable<>,讓你運行單個查詢,而不是兩個:

public static IQueryable<Account> GetAllNotesByUser(Guid UserId) 
{ 
    ... 
} 

有可能是你需要枚舉情況沒有執行任何額外的操作,結果爲GetAllNotesByUser。在這些情況下,請記住您可以調用'ToList()`強制執行查詢。

var result = GetAllNotesByUser(<guid>).ToList(); 
+0

'AsEnumerable'不強制執行查詢:http://stackoverflow.com/questions/3389855/am-i-i-misunderstanding-linq-to-sql-asenumerable – nawfal 2013-09-29 06:29:24

+0

是的,你是對的。 ToList()將強制執行。 – 2013-09-29 14:49:02

+0

尼爾,然後編輯你的答案。它保證downvote否則:) – nawfal 2013-09-29 14:56:52

1

有上IEnumerable<T> VS IQueryable<T>一個很好的答案here

如果您想進一步限制方法的調用方中的集合,例如使用WHERE子句,我將使用IQueryable(Of T)。否則我會使用IEnumerable(Of T),如果所有調用者都知道他們需要對結果執行ToList()(如果他們計劃多次迭代它(否則您將多次調用數據庫))。如果呼叫者不知道,我可能會使用ICollection(Of T)並在方法本身中執行ToList()。