我有一个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; }
}
这是public ActionResult TopItems()
{
var items = _ItemsService.GetAllQuerable(x => x)
.OrderBy(item => item.ItemsVote.Sum(vote => vote.TypeVote ? 1 : -1));
return View(items);
}
函数:
GetAllQuerable()
答案 0 :(得分:1)
您需要做的就是将true
值映射到1
和false
值到-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);