我有这个集合形状像这样的数据:获取基于最新的条目中的所有物品的清单
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