web-dev-qa-db-ja.com

LastおよびLastOrDefaultはサポートされていません

リストの最初の値と最後の値を取得しようとしています。クエリ演算子First()はサポートされていますが、Last()およびLastOrDefault()はエラーを返します。 Last()演算子を間違った方法で使用していますか?

   var purchaseBills = db.PurchaseBills.OrderBy(p => p.BillID);

   if (purchaseBills.Count() >0)
   {
       var firstBill= purchaseBills.First(); //This is supported

       //Attempt 1                    
       var lastBill = purchaseBills.Last(); // Not supported

       //Attempt 2
       var lastBill = purchaseBills.LastOrDefault(); //Not supported

       //Attempt 3
       var lastBill = purchaseBills.Reverse().First(); //Not supported

       textBoxPurchaseBillFrom.Text = firstBill.BillNo.ToString();
       textBoxPurchaseBillTo.Text = lastBill.BillNo.ToString();
   }

更新:-エラー-

試行1:クエリ演算子 'Last'はサポートされていません。

試行2:クエリ演算子 'LastOrDefault'はサポートされていません。

試行3:クエリ演算子 'Reverse'はサポートされていません。

39
Marshal
  • ToList()またはToArray()を呼び出してそれを独自のリストに入れる代わりに、AsEnumerable()を使用することを好みます。
  • さらに、他と同様に、OrderByDescending()を試してください。
  • Count()の代わりにAny()を使用します。
47
Oliver

orderByを

.OrderByDescending(p => p.BillID)

(そして最初に使用)またはあなたは次のようなことをします

purchaseBills.ToArray().Last()

これが高くない場合。

22
Carsten

Lastは、バックエンドDBではサポートされていません。他のテクニックを試してください:

  1. OrderByDescendingを使用してクエリを実行し、要求されたアイテムが最初に来るようにします。

  2. 通常どおりLINQクエリをコーディングしますが、Linq2Sqlを強制してCLRコレクションにレンダリングすると、Lastを含むローカルのすべてに自由にアクセスできます。例:

    var bills = purchaseBills.ToList();
    var last = bills.Last();
    
18
user326563

問題は、LastまたはReverseのSQLへの簡単な翻訳がないため、メモリ内の何か(ToListToArray)に変換することです。レコードが多すぎることはありません。また、OrderByDescendingの代わりにOrderByを使用して2回目のクエリを実行し、Firstを使用することもできます。

10
George Duckett

私はLastOrDefault()を使用しないようにしています。いつか機能しないか、サポートされないからです。 iddescで並べ替えてから、最初のレコードを取得します。

.OrderByDescending(o=>o.id)
.FirstOrDefault(s => s.Name == Name)
6
Lap Huynh

Last演算子が、対応するコマンドがないSQLサーバーに送信されようとしているという事実と関係があります。一度の解決策は、db呼び出しの最後にToArray()またはTolist()を配置することです。これにより、その1行がデータを取得するための明示的な呼び出しになります。行)。

2
Erik Philips

さらに別の方法では、orderbydescendingなしで最後の要素を取得し、すべてのエンティティをロードします。

var lastBill = purchaseBills
    .Where(f => f.BillID == purchaseBills.Max(f2 => f2.BillID))
    .FirstOrDefault();
1
Stas Boyarincev