2010-07-09 65 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是相当生疏,所以纠正我,如果我犯了一个错误。