我有这样的数据集合:
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-app中获取特定商品价格时创建的价格清单对象。它可以在同一天,一周,一个月或一年中创建多次。
所以现在一本书可以成为一个类别的一部分,例如“漫画书”。我的问题是,我正在尝试创建一个方法,它只给我最新的条目,所以只有最近的日期,基于这个集合的所有项目。
以下是方法:
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>
答案 0 :(得分:1)
您可以尝试:
var result = m_Db.PriceList.GroupBy(r => r.m_BookID)
.Select(r=> new
{
BookID = r.OrderByDescending(t=> t.m_PriceListDate).First().m_BookID,
Date = r.OrderByDescending(t=> t.m_PriceListDate).First().m_PriceListDate,
});
(不确定会有多高效)