LINQ查询计算投票计数

时间:2017-06-18 09:42:06

标签: c# linq

我有一个Items表和ItemVotes表,每个用户可以放弃投票或投票给一个项目,他/她的投票由bool属性{{1}确定表。现在我希望通过投票获得ItemVotes订单列表,为此,我们需要计算Items票数减去true票数。

false

更新:

项目实体:

_ItemsService.GetAll(x => x.ItemVotes //here I have to order by vote)

ItemVotes实体:

public class Items : Entity<int>
{
    public int UserId { get; set; }
    public DateTime Date { get; set; }
    public string Subject { get; set; }

    public virtual ICollection<ItemVotes> ItemVotes { get; set; }
}

更新2:

我在这样的行动中使用Gilad Green的答案:

public class ItemVotes : Entity<int>
{
    public int ItemId { get; set; }
    public int UserId { get; set; }
    public DateTime Date { get; set; }
    public bool TypeVote { get; set; }

    public virtual Items Items { get; set; }
    public virtual Users Users { get; set; }
}

enter image description here

这是public ActionResult TopItems() { var items = _ItemsService.GetAllQuerable(x => x) .OrderBy(item => item.ItemsVote.Sum(vote => vote.TypeVote ? 1 : -1)); return View(items); } 函数:

GetAllQuerable()

4 个答案:

答案 0 :(得分:1)

您需要做的就是将true值映射到1false值到-1来对投票进行求和。

_ItemsService.GetAll(x => x.ItemVotes)
    .Sum(v => v.Vote ? 1 : -1)

答案 1 :(得分:1)

要实现我想要一个按订单排序的项目列表首先检索所有项目,然后按描述的逻辑对它们进行排序:

retrievedItems.OrderBy(item => item.ItemVotes.Sum(vote => vote.TypeVote ? 1 : -1));

在您当前的_ItemsService.GetAll(x => x.ItemVotes)...代码中,您失去了知道哪个投票属于哪个项目的范围,因此将获得所有项目的单个摘要

答案 2 :(得分:0)

假设您有一个变量foo,其中包含项目,然后:

bar = foo.OrderBy(item => item.ItemVotes.Sum(vote => vote.TypeVote ? 1 : -1));

答案 3 :(得分:0)

您需要执行以下操作,以便根据他们的投票获得一个已排序的项目列表,其中包含最多正面投票项目。

在_ItemsService中公开一个方法GetOrderedItems,它将执行所有逻辑并返回所需的结果,而不是在调用者内部将逻辑运行到此服务。

GetOrderedItems(Func<bool,int> predicate)
{
 return items.OrderByDescending(p => p.ItemVotes.Select(x => x.TypeVote).Sum(predicate)).ToList();        
}

在您对服务的调用中,您可以像这样传递选择器:

Func<bool, int> getPositiveVotedItemsFirst = (vote) => vote ? 1 : -1;

var itemsOrderedByPositiveVotes = _ItemsService.GetOrderedItems(getHighlyVotedItems);

现在,只需更改选择器,即可轻松获取投票最少的商品。

Func<bool, int> getLeastVotedItemsFirst = (vote) => !vote ? 1 : -1;

var itemsOrderedByNegativeVotes = _ItemsService.GetOrderedItems(getLeastVotedItemsFirst);