0

特定のユーザーの関係番号に基づいて、データベースから前月の請求書を取得する必要があります。以下のlinqクエリを思いつきました。

// ステップ 1: 関係番号と OrderByDescending 句に基づいて Bill 番号を取得する
**

var query = context.Billings 

 .OrderByDescending(c => c.BillGenerationDate)
                               .Where(c => c.CAFNO == caf)
                               .Select(c => c.BillNo)
                               .FirstOrDefault();

** //ステップ 2 : ステップ 1 の結果には、//BillGeneration 日付でフィルタリングされた最後の (または最高の) 請求書番号があります

var bill = (from b in context.Billings
                            where b.BillNo == query
                            select b).FirstOrDefault();

ステップ 2 では、必要な完全な請求情報が得られます。

また

他の方法 :

var myresult = (from c in context.Billings
                            where c.CAFNO == caf
                            orderby c.BillGenerationDate descending
                            select c).FirstOrDefault();

上記のクエリは、より良い方法で書き直すことができると思います。上記のクエリをより効率的な方法で書き直すための提案を探しています。

ありがとう !!!

4

1 に答える 1

0

BillGenerationDateNullable であるため更新

現在のクエリでは、前月の請求書ではなく、最新の請求情報が得られます。前月を簡潔に取得するには、次のようにします。

var invoice = context.Billings
                     .FirstOrDefault( 
                         c => c.CAFNO == caf && 
                              (c.BillGenerationDate ?? new DateTime()).AddMonths(1).Month == DateTime.Now.Month &&
                              (c.BillGenerationDate ?? new DateTime()).AddMonths(1).Year == DateTime.Now.Year)

ただし、月に複数の請求書がある場合、これは注文を保証するものではなく、注文フレーズを再度追加するだけで済みます.

var invoice = context.Billings
                     .OrderByDescending(c => c.BillGenerationDate)
                     .FirstOrDefault( 
                         c => c.CAFNO == caf && 
                              (c.BillGenerationDate ?? new DateTime()).AddMonths(1).Month == DateTime.Now.Month &&
                              (c.BillGenerationDate ?? new DateTime()).AddMonths(1).Year == DateTime.Now.Year)

注: これは、上記の 2 番目のクエリ (追加の月フィルターを除く) と実際には違いはありません。FirstOrDefault(Func<T,Bool)オーバーロードは構成されたように機能するWhere(Func<T,Bool>).FirstOrDefault()ため、どちらを選択するかがより読みやすくなります。

于 2012-12-13T09:43:32.670 に答える