2017-06-18 141 views
0

我有一個Items表和ItemVotes表,每個用戶可以放棄投票或向下投票到一個項目和他/她的投票決定由ItemVotes表中的bool財產。現在我想要有一個Items排行榜的清單,爲此,我們需要得到true票數減去false票數。LINQ查詢計算投票計數

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

UPDATE:

項目實體:

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; } 
} 

ItemVotes實體:

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; } 
} 

更新2:

我用吉拉德格林的答案在動作是這樣的:

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

enter image description here

這裏是GetAllQuerable()功能:

public IEnumerable<T> GetAllQuerable(
     Expression<Func<T, 
     bool>> filter = null, 
     Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null, 
     string includeProperties = "") 
    { 
     return _repository.GetAllQuerable(filter, orderBy, includeProperties); 
    } 
+0

這將有助於展示更廣泛的代碼範圍和你的對象 –

+0

@GiladGreen我已經更新了它。 – mohammad

+0

看到我的回答在 –

回答

1

爲了實現我想有通過投票首先檢索所有內容,然後通過所描述的邏輯命令他們的項目順序列表:

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

在當前的代碼_ItemsService.GetAll(x => x.ItemVotes)...你輸了知道哪個投票屬於哪個項目,因此將一起獲得所有項目的單個摘要的範圍

+0

like @ michael_coxon的回答我已經得到了你的解決方案的兩個錯誤。 – mohammad

+0

@mohammad請顯示您使用代碼的上下文。 –

+0

我希望我理解正確。我使用工作單元,例如'http:// techbrij.com/generic-repository-unit-of-work-entity-framework-unit-testing-asp-net-mvc' – mohammad

1

所有你需要做的是總和映射票true值到1false值到-1

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

以下我得到了兩個錯誤:不能隱式地將類型'int'轉換爲'bool'並且不能將lambda表達式轉換爲塊中預期的委託類型不隱式轉換爲委託返回類型 – mohammad

+0

這不回答這個問題.... –

0

讓我們假設你有一個變量foo你有項目,那麼:

bar = foo.OrderBy(item => item.ItemVotes.Sum(vote => vote.TypeVote ? 1 : -1)); 
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);