【问题标题】:Entity Framework - Group and Min实体框架 - 组和最小值
【发布时间】:2014-08-28 19:59:04
【问题描述】:

以下代码是单次转移投票(STV)系统中的第二次运行。

' Elected Officials From Previous Count with excess votes
Dim Officials = From o In PlatoDB.ElectionCounts
                Where o.Count = ElectionCount - 1 AndAlso o.Votes > Quota
                Order By o.Votes Descending

If ElectionCount - 1 = 1 Then
   For Each o In Officials
       Dim oVotes = GetVotes(ElectionId)
       Dim oInheritableVotes = From vote In oVotes
                               Where vote.Preference = 1 AndAlso
                                     vote.LinkId = o.CandidateId AndAlso
                                     vote.Vote_Headers.Used = False
                               Select vote.Vote_Headers

我目前的问题是在这里我需要按 Vote_HeaderID 分组并以最小偏好检索投票。到目前为止我得到的最好的是最小偏好和投票的父级(Vote_HeaderId)。

       ' Gets the next available preference which hasn't been elected
       Dim NextPreference = From inheritedVote In oInheritableVotes
                            From v In PlatoDB.Votes
                            Where v.Vote_HeaderId = inheritedVote.Id AndAlso
                                  v.Preference > 1 AndAlso
                                  Not Officials.Select(Function(f) f.CandidateId).Equals(v.LinkId)
                            Group v By v.Vote_HeaderId Into Group
                            Select Vote_HeaderId, MinVote = Group.Min(Function(f) f.Preference)).ToList
    Next
Else

End If

有没有人建议我如何直接获得 vote_id 而不必使用当前列表来获得实际投票。

【问题讨论】:

标签: .net vb.net linq entity-framework-6


【解决方案1】:

我对 Groups 的理解是这样的:

Group x By Key = new with { Key .FirstKey = Entity.Property, .EntityFk = Entity.PropertyB,  [.KeyName = Entity.PropertyX]} Into GroupName = Group
Select new [Type Or Anonymous] With { .EntityId = Key.FirstKey, .EntityFk = }

因此,您的代码应如下所示:

Dim NextPreference = From inheritedVote In oInheritableVotes
                            From v In PlatoDB.Votes
                            Where v.Vote_HeaderId = inheritedVote.Id AndAlso
                                  v.Preference > 1 AndAlso
                                  Not Officials.Select(Function(f) f.CandidateId).Equals(v.LinkId)
                            Group v By Key = new with {Key .VoteHeaderId = v.Vote_HeaderId} Into VoteHeader = Group
                            Select new With {.VoteHeaderId = Key.VoteHeader, .MinVote = Group.Min(Function(f) f.Preference)}.ToList

这应该让你开始

干杯!

更新

请记住,如果没有完整的结构,很难测试,但我认为您需要像这样更改分组

   Group v By v.Vote_HeaderId} Into VoteHeader = Group
   let MinVote = Group.Min(Function(f) f.Preference)
   from g in VoteHeader
   Select new With {.VoteId = g.vote_id, .MinVote = MinVote }

为了帮助你更多,我需要这个结构;)

【讨论】:

  • 这和我的代码完全一样,你什么也没做,只是改写它。
  • 我认为 v.Vote_HeaderId 是您遇到问题的那个,所以您的样本中的这个 vote_Id 在哪个表中
  • 它是 'From v In PlatoDB.Votes' 它将是 v.Id。我的问题是如何获得 min 和 voteid。
【解决方案2】:

我能够获得正确的 MIN 作为在可用答案中检索到的那个,而我的问题一般是在哪里返回最小值,但我需要特定 ID 的最小值。

Dim NextPreference = (From inheritedVote In oInheritableVotes
                      From v In PlatoDB.Votes
                      Where v.Vote_HeaderId = inheritedVote.Id AndAlso
                            v.Preference > 1 AndAlso
                            Not Officials.Select(Function(f) f.CandidateId).Contains(v.LinkId)
                      Group v By v.Vote_HeaderId Into Group
                      Select Vote_HeaderId, 
                             CandidateID = Group.Where(Function(f) f.Vote_HeaderId = Vote_HeaderId AndAlso
                                                                                           f.Preference = (Group.Where(Function(vh) vh.Vote_HeaderId = Vote_HeaderId).Min(Function(p) p.Preference))
                                                                                           ).Select(Function(c) c.LinkId).Single
                                                                                       ).ToList

尽管我仍然必须感谢 CheGueVerra 提供的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多