2010-07-09 64 views
3

我有兩種方法:LINQ通用SUM - VB.NET

Public Function GetTotalLimit(ByVal entity As Entity) As Int64 

     Return (From c In entity.Collection 
       Select c.Limit).Sum() 

    End Function 

    Public Function GetTotalUsed(ByVal entity As Entity) As Int64 

     Return (From c In entity.Collection 
       Select c.Used).Sum() 

    End Function 

我有一種感覺,這些都可以重構爲一個單一的方法與簽名:

Public Function GetTotal(Of TKey)(ByVal entity As Entity, ByVal field As Func(Of CollectionType, TKey)) As Int64 



    End Function 

我來自一個C#的背景,這阻礙了我弄清楚這種方法的肉。任何人都可以幫忙

回答

4

爲什麼不上你的「獲取」語句中使用的IQueryable,

Public Function GetUsers() As IQueryable(Of User) Implements IUserRepository.GetUsers 
     Dim users = (From u In dc.Users 
        Select u) 
     Return users. 
    End Function 

,做這些函數的查詢。

Dim GetUser As User = UserRepository.GetUsers().Where(Function(u) (u.ID = id)).SingleOrDefault 
Return GetUser 

看一看My Blog哪裏我跟在你的數據訪問約Separating Concerns

編輯:

因爲你的方法是GetTotalLimitGetTotalUsed,我不知道什麼是「對象」你得到。我會嘗試使用我的用戶類來實現它。

保持IQueryable的相同,在調用該方法,你會做這樣的事情

Dim TotalLimitUsers = UserRepository.GetUsers().Sum(Function(u) u.Limit) 
Dim TotalUsedUsers = UserRepository.GetUsers().Sum(Function(u) u.Used) 
+0

我很努力地看到這是如何適用於我的情況。也許這是星期五的時刻之一,但你介意將解決方案應用於我的問題嗎?乾杯。 – youwhut 2010-07-09 08:41:55

+0

我編輯了我的答案。 – 2010-07-09 08:51:00

+0

不錯 - 這是一個星期五的時刻。 – youwhut 2010-07-09 09:02:25

0

你提出GetTotal功能已經存在於.NET和只是Sum過載。你會這樣稱呼它entity.Collection.Sum(Function(c) c.Limit),或使用你的例子:

Public Function GetTotalLimit(ByVal entity As Entity) As Int64 
    Return entity.Collection.Sum(Function(c) c.Limit) 
End Function 

Public Function GetTotalUsed(ByVal entity As Entity) As Int64 
    Return entity.Collection.Sum(Function(c) c.Used) 
End Function 

我的VB是相當生疏,所以糾正我,如果我犯了一個錯誤。