我有這個集合形狀像這樣的數據:獲取基於最新的條目中的所有物品的清單
public class PriceList
{
[Display(Name = "Price List ID")]
public int m_ID { get; set; }
[Display(Name = "Price List Provider")]
public int m_Provider { get; set; }
[Display(Name = "Current Book")]
public int m_BookID { get; set; }
public BookInfo m_Book { get; set; }
[Display(Name = "Price")]
public decimal m_Price { get; set; }
[Display(Name = "Date of price list")]
public DateTime m_PriceListDate { get; set; }
}
價目表是,當我拿到的價格爲特定項目創建一個價格表對象在我的mvc應用程序。它可以在同一天,每週,每月或每年創建多次。
所以現在一本書可以成爲一個類別的一部分,例如「漫畫書」。而我的問題是,我正在嘗試創建一個方法,它只會給我最近的條目,所以只有最近的日期,基於這個集合的所有項目。
這裏的方法:
public List<PriceList> ListLatestPriceListByBookCategoryID(int _id)
{
List<PriceList> listToReturn = new List<PriceList>();
var priceListQry = from pl in m_Db.PriceList
where pl.Book.BookCatID == _id
// INSERT CODE HERE???
select pl;
if (!priceListQry.Any())
{
return null;
}
listToReturn.AddRange(priceListQry);
return listToReturn;
}
基本上,我想創建一個查詢,將只返回所需的數據。而這些所需的數據僅包含由id找到的每本書的最新條目。我可以有許多類別和許多書籍。
任何人都可以幫我解決這個問題嗎?到目前爲止,我所做的一切都是通過遍歷整個列表來過濾所有不必要的數據的一種巨大方法,但是我希望更有效的方式,因爲我最終會獲得大量數據,這將證明需要很多時間。
*編輯*
截至目前我已經加入這行代碼:
var result = m_Db.PriceList.GroupBy(r => r.BookID).Select(r => new
{
BookID = r.OrderByDescending(t => t.PriceListDate).First().BookID,
PriceListDate = r.OrderByDescending(t => t.PriceListDate).First().PriceListDate
});
而且我有這行代碼沒有錯誤,並將其對我來說很有意義。然而,listToReturn.AddRange(result)
行現在拋出這個錯誤:
Error 13 Argument 1: cannot convert from 'System.Linq.IQueryable<AnonymousType#1>' to 'System.Collections.Generic.IEnumerable<MyApp.Models.Entities.PriceList>
兩個問題: list.GroupBy究竟是什麼?你會通過查詢或之後調用這個方法嗎? – hsim 2013-04-23 12:12:24
@HerveS,「GroupBy」顧名思義將根據BookID對列表進行分組,然後從該組中選擇基於最近日期訂單的第一條記錄。您也可以在DB端執行該查詢,但它可能需要一些性能改進。看到生成SQL,你將能夠更好地理解它。 – Habib 2013-04-23 12:14:33
好的,我會試試這個。 'list.'是一個變量? – hsim 2013-04-23 12:16:17