18
Context db = new Context();
List<Invoice> invoice =
(from LocalInvoice in db.Invoices
where LocalInvoice.Site_Id == this.SiteIdentifier
select LocalInvoice).ToList();

レコードのリストを返します。リストの最後を選択したい。試しまし.ToList().LastOrDefault(); たが、「invoice」タイプを「System.Collections.Generic.List」に変換できないというエラーが発生しました。

請求書をリストとして宣言していないのはなぜですかList<Invoice> invoice

どんな助けでも大歓迎です。Ta


編集 返信ありがとうございます。皆さんのアドバイスを試してみましたが、毎回エラーが発生します。クエリ演算子「LastOrDefault」はサポートされていません。

また、問題を引き起こしている可能性のある全体的なことを実際に説明していません。すべての請求書を含むテーブルがあり、それぞれに個別の「id」が付いています。ただし、各レコードには、異なる請求書に複数回使用されるSiteIdentifier列があります。したがって、各サイトには複数の請求書がある場合があります。

サイトの最新の請求書を取得しようとしています。だから請求書を言う

id SiteIdentifier 
73 25
74 25
75 25

SiteIdentifier == this.SiteIdentifier(eg25)であるすべてのレコードを取得しようとしてから、請求書ID75の最新のレコードを取得しようとしました。

誰かアイデアはありますか?再びすべての助けに感謝します

4

3 に答える 3

29

LastOrDefaultは、単一の要素を返します。最初にフィルターを適用せずにToListを呼び出さないでください。必要なときに、データベースからすべての行が取得されます。

var invoice = db.Invoices.LastOrDefault(s => s.Site_Id == this.SiteIdentifier);

また、リレーショナルテーブルをクエリする場合は、順序付けを適用する必要があります。LastOrDefaultは、メモリ内のコレクションでのみ意味があります。EFでサポートされていないようで、例外がスローされます。

最善の解決策は、順序を逆にしてFirstOrDefaultメソッドを使用することです。

var invoice = db.Invoices.OrderByDescending(s => s.Id) 
                         .FirstOrDefault(s => s.Site_Id == this.SiteIdentifier);
于 2013-03-27T13:20:54.830 に答える
5

LastOrDefaultは、コレクションではなく請求書のインスタンスを返すため、変数タイプを変更します。

Invoice invoice =
   (from LocalInvoice in db.Invoices
    where LocalInvoice.Site_Id == this.SiteIdentifier
    select LocalInvoice).LastOrDefault();

またはまだクリーナー:

var invoice = db.Invoices.LastOrDefault(i => i.Site_Id == this.SiteIdentifier);
于 2013-03-27T13:20:49.913 に答える
0

LastOrDefaultではなく、単一の要素を返しListます。これはうまくいくでしょう:

Invoice invoice =
    (from LocalInvoice in db.Invoices
     where LocalInvoice.Site_Id == this.SiteIdentifier
     select LocalInvoice)
    .LastOrDefault();
于 2013-03-27T13:20:58.633 に答える