次のようなコレクションがあったとします。

List<Item> itemlist = new List<Item>();
itemlist.Add(new Item(){Id = 1, Name = "A"});
itemlist.Add(new Item(){Id = 2, Name = "B"});
itemlist.Add(new Item(){Id = 3, Name = "C"});

class Item
{
  int Id {get;set;}
  string Name{get;set;}
  int value {get;set;}
}

また、SQL Serverのテーブルには以下のレコードが10M件あるとします。

------------------------
|Id | DateTime | Value |
------------------------
|1 | 2017-09-26 13:03 | 9|
------------------------
|1 | 2017-09-26 13:03 | 5|
------------------------
|1 | 2017-09-26 13:03 | 2|
------------------------
.
.
.
|3 | 2017-01-01 00:01 | 11|
------------------------

このデータベースから該当Itemの最新データを取得する効率のよい方法をご教授いただきたいです。

foreach(var n in itemlist)
{
 n.value = table.where(c=>c.Id = n.Id).OrderByDescending(c=>c.DateTime).Select(c=>c.value).FirstOrDefault();
}

この方法で取得すると、レコードが多い場合、OrderbyDescendingがあるせいかとても遅くなります。。

何か他によい方法がございますでしょうか。

.NET Framework4.0の環境で開発しています。
よろしくお願いします。