私はこのような形のデータのコレクションを持っています:
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>