LINQ Generic SUM - VB.NET - PullRequest
       1

LINQ Generic SUM - VB.NET

3 голосов
/ 09 июля 2010

У меня есть два метода:

    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 # фона, который мешает мне понять суть этого метода. Кто-нибудь может помочь?

Ответы [ 2 ]

4 голосов
/ 09 июля 2010

Почему бы не использовать IQueryable в своем заявлении "Get",

    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

Посмотрите Мой блог , где я говорю о Разделении проблем в вашем доступе к данным.

EDIT:

Так как ваши методы GetTotalLimit и GetTotalUsed, я не уверен, какие "объекты" вы получаете. Я попробую и использую мой класс пользователя.

Сохраняйте IQueryable таким же, и при вызове метода вы будете делать что-то вроде

Dim TotalLimitUsers = UserRepository.GetUsers().Sum(Function(u) u.Limit)
Dim TotalUsedUsers = UserRepository.GetUsers().Sum(Function(u) u.Used)
0 голосов
/ 09 июля 2010

Ваша предложенная функция 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 довольно ржавый, поэтому исправьте меня, если я допустил ошибку.

...